2010-03-03 11 views
11

Mam strukturę danych vector<set<char> > (baza danych transakcji) i chcę znać jej wielkość. Kiedy używam sizeof() z każdym set<char>, rozmiar wynosi 24, mimo że zestaw zawiera 3, 4 lub 5 znaków. Później, kiedy używam sizeof() z vector<set<char> >, rozmiar wynosi 12 ... Przypuszczam, że nie jest to sposób poznania rozmiaru struktury danych. Jakaś pomoc? Dzięki.sizeof() a wektor

+8

sizeof() jest operatorem kompilacji –

Odpowiedz

18

Chcesz vector::size() i set::size().

Zakładając v to wektor, to zrobić:

size_t size = 0; 
for (vector<set<char> >::const_iterator cit = v.begin(); cit != v.end(); ++cit) { 
    size += cit->size(); 
} 

sizeof() daje Ci rozmiar w pamięci obiektu/typ jest stosowany do, wielokrotność sizeof(char) (zwykle jeden bajt). Jeśli chcesz wiedzieć, rozmiar w pamięci zbiornika i jego elementów, można to zrobić:

sizeof(v) + sizeof(T) * v.capacity(); // where T is the element type

+0

Co, jeśli już zarezerwował swój wektor? –

+1

@John: A co, jeśli on * ma *? 'reserve()' ma * nic * do zrobienia z 'size()'. –

+0

Myślę, że John oznacza, że ​​jeśli chcesz wiedzieć, ile pamięci zajmuje wektor (i zawartość), powinieneś patrzeć na pojemność, a nie na rozmiar. "Wielkość pamięci kontenera i jego elementów" jest oczywiście niejednoznaczna, ale podejrzewam, że jest bardziej prawdopodobne, że jest ona rozumiana jako odnosząca się do ilości pamięci przydzielonej przez wektor, a nie do ilości pamięci zajmowanej obecnie przez elementy. –

2

sizeof() jest obliczana w czasie kompilacji, więc nie ma sposobu, może powiedzieć, jak wiele elementów ma wnętrze.

Użyj metody size() obiektu wektorowego.

7

sizeof zwraca rozmiar samego obiektu. jeśli zawiera wskaźnik do tablicy, na przykład nie będzie liczony w rozmiarze tablicy, zlicza tylko rozmiar wskaźnika (4 na 32 bitach) do użytku wektorowego .size

0

Użyj funkcji składowej, aby znaleźć liczbę elementów w wektorze . Wskazówka - są one przydzielane w wolnym sklepie.

5

Wektor jest zaimplementowany przy użyciu wewnętrznych wskaźników do rzeczywistego miejsca przechowywania. Dlatego sizeof() zawsze zwraca ten sam wynik, który nie obejmuje samego przechowywania danych. Zamiast tego spróbuj użyć metody vector::size(). Spowoduje to zwrócenie liczby elementów w wektorze.

1

vector w STL jest szablon klasy, kiedy dasz parametr szablonu wewnątrz <SomeType> po wektorze, C++ kompilator wygenerowany kod dla klasy typu SomeType. Więc kiedy zapełnisz wektor przy użyciu push_back, wstawiasz kolejny obiekt o numerze SomeType, więc gdy zażądasz .size() z kompilatora, podasz liczbę obiektów SomeType wstawionych przez ciebie.
Mam nadzieję, że pomaga!

+1

Cóż, to jest odpowiedź w pobliżu stodoły ... Kto powiedział, że używa 'push_back' i jak to jest istotne? W jaki sposób fakt, że wektor jest szablonem, ma znaczenie? Ale przynajmniej masz rację, że 'size()' jest tym, czego szuka OP. –

+1

@STingRaySC Próbowałem wyjaśnić OP, że sizeof nie ma nic wspólnego z tym, czego chciał. Jest to metoda .size(), której powinien/powinna/poszukiwać. –