2012-10-31 10 views
9

Czy mogę utworzyć std::vector przy użyciu moich wcześniej istniejących danych zamiast przydzielania nowej pamięci i kopiowania danych?C++ wektor STL dla istniejących danych

Aby być bardziej przejrzystym, jeśli mam obszar pamięci (albo tablicę c lub część innego wektora lub cokolwiek innego) i chcę zapewnić dostęp do niego w stylu wektorowym, czy mogę utworzyć wektor i powiedzieć, żeby go użyć ten blok pamięci?

+1

Jak masz zamiar używać tego wektora? – Andrey

+0

Być może jeszcze lepiej nie używać w ogóle "wektorowych" lub podobnych pojemników. Dlaczego chcesz umieścić swoje dane w osobnym pojemniku? –

+1

Ważne jest, aby wiedzieć, w jaki sposób zamierzasz używać wektora. Na przykład w odpowiedzi Luchian, wynikowy wektor nie będzie "wektorem ", będzie to "wektor ". Więc jeśli powodem, dla którego potrzebujesz wektora, jest przekazanie go do jakiejś funkcji, która oczekuje 'wektora ' to ci nie pomoże. Jeśli potrzebujesz wektora do jakiegoś innego celu, może ci to pomoże. –

Odpowiedz

7

Nie, ale możesz napisać własną klasę, która to robi. Ponieważ byłaby to dość powszechna potrzeba, nie byłbym zaskoczony, gdyby ktoś już to zrobił.

Jednak normalnym sposobem C++ byłoby napisanie kodu szablonu do działania na iteratorach. Możesz tworzyć iteratory dla dowolnej części wektora lub dla dowolnej części tablicy C (i wiele innych). Pisanie kodu szablonu dla iteratorów jest prawdopodobnie tym, co powinieneś robić.

+1

Dlaczego niestandardowy program przydzielania nie działał? –

+0

Czy możesz wyjaśnić to trochę więcej? Czy chcesz utworzyć szablonową klasę z interfejsem wektorowym, który akceptuje iteratory do jego konstruktora i używa ich wewnętrznie? – baruch

+1

Dlaczego należy próbować wymyślić na nowo koło, gdy alokatory mogą wykonać zadanie? "Nowy" wektor 'może mieć 99% wspólnego kodu z' std :: vector'. – Acorbe

2

Ponieważ można użyć niestandardowego przydziału przy tworzeniu vector, jest to technicznie możliwe.

Jednak, nie polecam go. Właśnie utworzyłem wektor o ustalonym rozmiarze (najwyraźniej możesz to zrobić), a następnie użyj std::copy.

+0

Co się stanie, jeśli istniejąca tablica ma rozmiar 'n' i z jakiegokolwiek powodu wektor pyta alokatora o przestrzeń o rozmiarze' n + 1'? Nie twierdzę, że to na pewno się stanie, ale jestem prawie pewny, że standard pozwala "wektorowi" przesadzić, niezależnie od tego, na jaki margines ma ochotę, i wykorzystać nadmiar przestrzeni pod koniec alokacji do tego, co mu się podoba. Prawdopodobnie mógłbyś napisać alokator, aby zauważyć cokolwiek nieprzyjemnego, i powrócić do zachowywania się jak normalny przydział. –

1

Algorytmy iteracyjne nad pojemnikiem przyjmują parę iteratorów, które definiują zakres wejściowy. Możesz użyć algorytmu z iteratorami, które wskazują na środek dużego kontenera.

Przykłady:

std::vector<int> big_vector(100000); 
// initialize it 
//... 
std::sort(big_vector.begin()+100, big_vector.begin()+200); // sort a subrange 

int big_array[100000]; //c-style array 
// initialize it 
//... 
std::sort(std::begin(big_array)+300, std::begin(big_array)+400); // sort a subrange