Es scheint sicher zu sein, das Ergebnis meines Vektors size()
Funktion zu einer unsigned int
. Aber wie kann ich das mit Sicherheit feststellen? In meiner Dokumentation ist nicht klar, wie size_type
definiert ist.
Antworten
Zu viele Anzeigen?Nehmen Sie nicht den Typ der Containergröße an (oder irgendetwas anderes, das darin eingegeben wird).
Heute?
Die beste Lösung ist im Moment die Verwendung:
std::vector<T>::size_type
Dabei ist T Ihr Typ. Zum Beispiel:
std::vector<std::string>::size_type i ;
std::vector<int>::size_type j ;
std::vector<std::vector<double> >::size_type k ;
(Die Verwendung eines Typedefs könnte dazu beitragen, dass dies besser lesbar ist)
Das Gleiche gilt für Iteratoren und alle anderen Typen "innerhalb" von STL-Containern.
Nach C++0x?
Wenn der Compiler in der Lage ist, den Typ der Variablen zu ermitteln, können Sie das Schlüsselwort auto verwenden. Zum Beispiel:
void doSomething(const std::vector<double> & p_aData)
{
std::vector<double>::size_type i = p_aData.size() ; // Old/Current way
auto j = p_aData.size() ; // New C++0x way, definition
decltype(p_aData.size()) k; // New C++0x way, declaration
}
Bearbeiten: Frage von JF
Was ist, wenn er die Größe des Containers an einen bestehenden Code übergeben muss, der z. B. einen unsigned int verwendet?
Dies ist ein allgemeines Problem bei der Verwendung der STL: Sie können es nicht ohne einige Arbeit tun.
Die erste Lösung besteht darin, den Code so zu gestalten, dass immer der STL-Typ verwendet wird. Zum Beispiel:
typedef std::vector<int>::size_type VIntSize ;
VIntSize getIndexOfSomeItem(const std::vector<int> p_aInt)
{
return /* the found value, or some kind of std::npos */
}
Die zweite Möglichkeit ist, die Konvertierung selbst vorzunehmen, entweder mit einem static_cast oder mit einer Funktion, die feststellt, ob der Wert außerhalb der Grenzen des Zieltyps liegt (manchmal sehe ich Code, der "char" verwendet, weil " Sie wissen, dass der Index nie über 256 hinausgehen wird. " [ich zitiere aus dem Gedächtnis]).
Ich glaube, das könnte eine vollständige Frage für sich sein.
Der C++-Standard besagt nur, dass größe_t befindet sich in <cstddef>, wodurch die Bezeichner in <stddef.h> stehen. Meine Kopie von Harbison & Steele setzt die Mindest- und Höchstwerte für größe_t in <stdint.h>. Das sollte Ihnen eine Vorstellung davon geben, wie groß Ihre Empfänger-Variable für Ihre Plattform sein muss.
Am besten halten Sie sich an Integer-Typen, die groß genug sind, um einen Zeiger auf Ihrer Plattform zu halten. In C99 wäre das intptr_t y uintptr_t die sich auch offiziell in <stdint.h> befindet.
- See previous answers
- Weitere Antworten anzeigen