2012-06-05 33 views
15

wiem, że std::vector<T> wewnętrznie przechowuje To dane ciągły (chyba że jest std::vector<bool>) zarówno w starym C++03 standardowej i nowej C++11.std :: vector std :: wektory sąsiedztwo

Ładne pytania dotyczące stackoverflow, które dotyczą tego i podają standard: answer, answer.

Co z danymi wewnątrz zagnieżdżonych wektorów std::vector <std::vector <T> >? Jak to jest przechowywane?

Jeśli każdy wewnętrzny wektor musi przechowywać dane w sposób ciągły, jak to może być prawdziwe, &v[n] == &v[0] + n for all 0 <= n < v.size().

Aby to zdanie było nieco inne, można uzyskać dostęp do wszystkich elementów przechowywanych w takiej strukturze zagnieżdżonej "po prostu" i kolejno (za pomocą wskaźnika lub podobnego) w ten sam sposób, w jaki można to zrobić dla wektora 1-D ?

Odpowiedz

19

Nie. Elementy vector są przechowywane w dynamicznie przydzielonym bloku pamięci; w przeciwnym razie pojemność modelu vector nie może wzrosnąć. Obiekt vector po prostu trzyma wskaźnik do tego bloku.

Wymaganie, aby elementy były przechowywane sekwencyjnie, odnosi się tylko do samych elementów, a nie do dynamicznie przydzielanych elementów tych elementów.

+0

+1 dla wskazując na wzrost zdolności wektora :) – LihO

4

std::vector< std::vector<T> > to wektor obiektów, które są przechowywane w sąsiadującym bloku pamięci. Również fakt, że te obiekty są wektorami, jest nieistotny.

Chociaż elementy wektora są przechowywane w sąsiadującym bloku pamięci, pamięć, w której znajdują się elementy, nie jest częścią samego obiektu wektorowego.

„jest możliwy dostęp do wszystkich elementów przechowywanych w taki zagnieżdżonej struktury«prosto», a kolejno (za pomocą kursora lub podobne), taki sam sposób może być wykonane za pomocą 1-wymiarowym wektorem?” Aby uzyskać dostęp do elementów std::vector, lepiej użyć metody operator[] lub at() niż do pobrania adresu pierwszego elementu i użycia arytmetyki wskaźnika. W przypadku tablic wielowymiarowych reprezentowanych jako wektor wektorów sugeruję, aby pozostać przy operator[], który jest łatwy w użyciu i łatwy do odczytania: myVector[i][j]. Warto również zobaczyć vector::at vs. vector::operator[] :)

4

Aby odpowiedzieć na ostatnie pytanie: Nie. Elementy wektora wektorów nie są przechowywane w sposób ciągły.

Rozważmy następujący kod:

std::vector<std::vector<int> > vv; 
.... fill in v[0], v[1], v[2], etc 
std::vector <int> & v = vv[1]; 
v.push_back (23); 

Gdyby były przechowywane w sposób zwarty, a tym, że powodują, że każdy element vv [2], VV [3], itp do poruszania się. Jak to by prawdopodobnie zadziałało, skoro wpływasz tylko na pojedynczy wektor "v"?

+0

I nie ma sensu go do pracy . Z drugiej strony wymóg ciągłości dezorientował mnie w połączeniu. – penelope

1

Czy można uzyskać dostęp do wszystkich elementów przechowywanych w takiej strukturze zagnieżdżonej "po prostu" i kolejno (za pomocą wskaźnika lub podobnego) w ten sam sposób, w jaki można to zrobić dla wektora 1-D?

Tak, jeśli:

  • zawsze tylko trzeba dodać rzeczy do końca swojej wektora wektorów i

  • jesteś gotów zastąpić wektor wektory konstruują z niestandardową strukturą danych

Co można wtedy zrobić, to połączyć wszystkie te podektory w pojedynczy ciągły bufor, z innym buforem indeksowym stosowanym do uzyskania dostępu do tego indeksu wpisu najwyższego poziomu.

Zobacz my article here więcej dyskusji na ten temat, a przykładem „zawalił wektor” wdrożenie klasy ..

Powiązane problemy