2013-06-06 18 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でも無条件に当てはまるとは言えません...しかし、あなたのコードにpush_backを使用することを主張すれば、C++ 11でも確かに当てはまります。

P.P.S. C++ 11では、おそらく裸のCスタイルの配列のstd::listと、新しい要素を構築するために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; 

ペアのペアすることができますが、それは読んで非常に混乱コードをもたらすことができる...

関連する問題