7 Stimmen

Wo kann ich die Definition von size_type für Vektoren in der C++ STL nachschlagen?

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.

12voto

paercebal Punkte 78198

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.

4voto

Konrad Rudolph Punkte 503837

Gemäß der Norm, Sie können nicht sicher sein . Der genaue Typ hängt von Ihrer Maschine ab. Sie können sich jedoch die Definition in den Header-Implementierungen Ihres Compilers ansehen.

3voto

Mark Ransom Punkte 283960

Ich kann mir nicht vorstellen, dass es auf einem 32-Bit-System nicht sicher wäre, aber 64-Bit könnte ein Problem sein (da Ints 32-Bit bleiben). Um sicher zu sein, warum nicht einfach Ihre Variable als vector<MyType>::size_type anstelle von unsigned int deklarieren?

1voto

CesarB Punkte 41671

Es sollte immer sicher sein, es zu size_t zu casten. unsigned int ist nicht genug auf den meisten 64-Bit-Systemen, und sogar unsigned long ist nicht genug auf Windows (die das LLP64-Modell anstelle des LP64-Modells die meisten Unix-ähnliche Systeme verwenden).

1voto

Don Wakefield Punkte 8445

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X