2012-06-15 12 views
15

Czy jest jakiś problem z moim kodem?Czy mogę pchnąć tablicę int do wektora C++?

std::vector<int[2]> weights; 
int weight[2] = {1,2}; 
weights.push_back(weight); 

To nie może być zestawiane, proszę pomóc wyjaśnić dlaczego:

no matching function for call to ‘std::vector<int [2], std::allocator<int [2]> >::push_back(int*&)’ 
+8

To będzie pracować z wektorem 'std :: array's,' std :: vector's lub 'std :: pair's. Twoja tablica rozkłada się na wskaźnik po jej przekazaniu, co powoduje problemy. – chris

+0

Dzięki, Chris. Rozumiem, że. – MrROY

+0

Wydaje mi się, że jest dobra odpowiedź, na którą trzeba odpowiedzieć, ze wszystkimi szczegółami, dlaczego nie działa, co znajdę w interesującej i pouczającej lekturze. Jest w tym coś więcej niż rozkład, ale nie jestem pewien, co tam jest. – chris

Odpowiedz

27

Powodem tablice nie może być stosowany w pojemnikach STL ponieważ wymaga rodzaj do skopiowania konstruowalne przypisywane (również przemieszczać konstruowalne C++ 11). Na przykład, nie można wykonać następujące czynności z tablicami:

int a[10]; 
int b[10]; 
a = b; // Will not work! 

Ponieważ tablice nie spełniają wymogów, nie mogą być stosowane. Jednakże, jeśli naprawdę trzeba użyć tablicę (co prawdopodobnie nie jest to przypadek), można dodać go jako członka klasy tak:

struct A { int weight[2];}; 
std::vector<A> v; 

jednak, to prawdopodobnie byłoby lepiej, jeśli użyte std::vector lub std::array.

4

cant zrobić, że po prostu.

Lepiej użyć jednej z nich:

  1. vector <vector<int>> (to w zasadzie dwuwymiarowa vector.It powinny działać w Twoim przypadku)

  2. vector<string> (napis jest tablicą znaków, więc potrzebujesz odlewania później. To może być łatwe.).

  3. można zadeklarować strukturę (powiedzmy S) posiadające szereg int typu w niej tj

    struct S{int a[num]}, następnie zadeklarować wektor vector< S>

więc pośrednio, jesteś pchanie tablicy w wektor.

+1

Dlaczego łańcuch? Pytanie dotyczy par "int". – huon

+0

Używasz ciągów? Y nie jest wektor? –

+0

wektor typu string !! – vijay

0

Wystarczy użyć

vector<int*> .That will definitely work. 

stosownej dyskusji na ten sam temat: Pushing an array into a vector

+2

To się skompiluje. Nie sądzę, że zrobi to, co ktoś racjonalnie chciałby zrobić! Jeśli tablica jest na stosie, twoje rozwiązanie zawiesi się. –

+0

Czy możesz mi powiedzieć Dlaczego nie? Po prostu spróbowałem prostego przykładu i działało zgodnie z oczekiwaniami. Wektor po prostu zapisuje adres początkowy tablicy.Tak, jeśli chcesz uzyskać dostęp do n-tego elementu, po prostu spójrz na wektor i przejdź do n-tego miejsca. – Arvind

+2

@Arvind: Racja. A wszystko działa, dopóki tablica nie opuszcza zakresu, lub spodziewasz się, że zrobienie kopii "wektora" spowoduje wykonanie głębokiej kopii. Wtedy zaczynają się dziać dziwne rzeczy. – Managu

4

Tablice nie są skopiować constructable więc nie można ich przechowywać w pojemnikach (vector w tym przypadku). Można przechowywać zagnieżdżone vector lub C++ 11 a std::array.

+0

Czy stwierdzenia to: 'std :: vector weight;' and 'std :: vector weight;' equivalent? – twsaef

+0

Nie, wymieniają one różne typy i tablica nie ulega degradacji do wskaźnika w tym punkcie. –

-2

Aby instancję wektor, musisz podać typ, ale int [2] nie jest typem, to jest deklaracja.

+6

'int [2]' jest typem. Jest to tablica 2 liczb całkowitych. Tablice też są typami, nie tak silnymi, jak w innych językach. – chris

+0

Jeśli był to typ, czy deklaracja nie byłaby "int [2] myvar;"? –

+2

@RogerDahl: Można by tak sądzić, ale nie. Możesz tworzyć szablony, które akceptują 'int [2]' jako typ ([przykład] (http://ideone.com/1mzLP)), to tylko typ nie spełnia wymagań 'std :: wektor ". Więc nie można go tam wykorzystać. –

4

tablicy mogą być dodane do zbiornika, jak to zbyt.

int arr[] = {16,2,77,29}; 
    std::vector<int> myvec (arr, arr + sizeof(arr)/sizeof(int)); 

Mam nadzieję, że to komuś pomaga.