2011-01-04 6 views
3

私は2Dベクトルをした今、私はこれを効率的に行うことができますどのようにベクトルを列方向にコピーするには?

vector < vector <int> > test; 

test = 4 5 
     9 0 
     1 1 
     2 2 

のような他の2Dベクターにのみ最後の2列をコピーしたい?

vector < vector <int> > sample; 

sample = 1 2 3 4 5 
     6 7 8 9 0 
     1 1 1 1 1 
     2 2 2 2 2 

を言いますか

+1

問題は、メモリが[1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 2 2 2 2 2 2]のようにレイアウトされていることです。あなたがここでmemcpyのように速くなるものを探しているなら、あなたが使うことができるファンキーなSIMD命令がないかぎり、あなたは不運になるでしょう。おそらく、良いole 'forループよりもはるかに速いものはありません。 – rcv

+0

SIMDはこれを助けません。 –

答えて

3

このようなのでしょうか?

#include <algorithm> 

vector<vector<int> > new_vector; 
new_vector.resize(sample.size()); 

for (size_t i = 0; i < new_vector.size(); ++i) { 
    new_vector[i].resize(2); 
    copy(sample[i].end() - 2, sample[i].end(), new_vector[i].begin()); 
} 
+0

あなたのものは私が欲しいものですが、実行時にセグメンテーションフォルトが発生しています。 –

+0

私は最初に入力したときに1行を忘れてしまった。あなたはnew_vector [i] .resize(2)を持っていますか?ライン? –

+0

その作業中です。ありがとう。 –

3

私はブーストはあなたの手で後押ししていない場合、私はループのために、通常で行くだろうforeachループ

std::vector< std::vector<int> > v; 
BOOST_FOREACH(std::vector<int> const &i, test) { 
    v.push_back(std::vector<int>(i.end() - 2, i.end())); 
} 

を持って聞きました。しかし、私は最初に入れ子のstd::vectorを使用するとは思わない。二列の行しかない場合は、boost::array<int, 2>のベクトルを使用するのが最適です。

関連する問題