2013-06-06 8 views
9

У меня есть эта проблема нечетногоНевозможно создать вектор массивов с фиксированным размером?

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 
    } 

Код кусок предполагается распутать список индексов треугольников полосы в индексы треугольника, но не будет компилировать под VS10. Мысли?

+4

Использование 'STD :: array'. – chris

ответ

20

Нет, если вы не обернете свои массивы в struct или не используете что-то вроде std::array.

Голый тип массива типа C не может быть скопирован или назначен, что делает его неприемлемым для использования в качестве стандартного элемента контейнера.

P.S. Следует отметить, однако, что C++ 11 переключился на более сложный (для каждого) подход к определению требований к типу элементов контейнера, а не к более широкому подходу, используемому C++ 03. Вышеупомянутое требование о дисквалификации основано на C++ 03. Я не готов сказать, что это так безоговорочно верно для C++ 11 ... Но это, безусловно, верно даже в C++ 11, если вы настаиваете на использовании push_back в своем коде.

P.P.S. В C++ 11 можно, вероятно, уйти с std::list из голых массивов C-стиля и использовать emplace для создания новых элементов. Но не с std::vector.

+1

Это лучший ответ, поскольку он кратко указывает * почему * пример недействителен, а не только что делать. –

11

Вместо этого использовать std::vector<std::array<unsigned, 3>>.

0

Если вы используете C++ 11, вы можете использовать кортежи.

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

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

Менее «элегантное» решение может быть пара пары

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

, но это может привести к очень запутанного кода, чтобы читать ...

Смежные вопросы