2013-06-06 8 views
9

mam ten dziwny problemuNie mogę zrobić wektor o stałych rozmiarach tablic?

vector<unsigned int[3]> tris; 
    for (unsigned int i = 0; i < idx.size() - 2; i++) { 
     unsigned int push[] = {idx[i], idx[i+1], idx[i+2]}; 
     tris.push_back(push); //<- this is where it goes belly up 
    } 

Kawałek kodu ma rozwikłać listę indeksu taśmy trójkąt do indeksów trójkątów ale przyzwyczajenie skompilować pod vs10. Myśli?

+4

Wykorzystanie 'std :: array'. – chris

Odpowiedz

20

Nie, chyba że owijacie macierze na struct lub używajcie czegoś takiego jak std::array.

Nagi typ tablicy w stylu C nie podlega kopiowaniu ani przypisywaniu, co uniemożliwia wykorzystanie go jako standardowego elementu kontenera.

P.S. Należy jednak zauważyć, że C++ 11 zamieniło się na bardziej rozbudowane (na metodę) podejście do określania wymagań dla typu elementu kontenerowego, zamiast bardziej szerokiego podejścia stosowanego przez C++ 03. Powyższe roszczenie dotyczące kwalifikacji jest oparte na C++ 03. Nie jestem gotowy, aby powiedzieć, że jest to tak bezwzględnie prawdziwe dla C++ 11 ... Ale jest to z pewnością prawda nawet w C++ 11, jeśli nalegasz na używanie push_back w swoim kodzie.

P.P.S. W C++ 11 prawdopodobnie można uciec z std::list nagimi tablicami w stylu C i używając emplace do konstruowania nowych elementów. Ale nie z std::vector.

+1

To jest lepsza odpowiedź, ponieważ zwięźle wskazuje * dlaczego * przykład jest nieprawidłowy, a nie tylko co robić. –

11

Zamiast tego użyj std::vector<std::array<unsigned, 3>>.

0

Jeśli używasz C++ 11, możesz używać krotek.

std::vector < std::tuple< unsigned int, unsigned int, unsigned int > > tris; 

https://stackoverflow.com/a/15734156/846686

Mniej 'eleganckie' rozwiązanie może być parą parę

std::vector < std::pair< unsigned int, std::pair<unsigned int, unsigned int> > tris; 

ale może to spowodować bardzo niejasnym kodu do odczytu ...

Powiązane problemy