4

私はそれらをintのベクトルに線形にコピーする必要があるペアのベクトルを持っています。うまく機能する次のコードがありますが、C++ の構造体パディングの問題を考慮して安全かどうかはわかりません。

std::vector < std::pair<int, int> > test_vector;
for (int i=0;i<5;i++) {
    test_vector.push_back(std::make_pair(i,i*5));
}
std::vector<int> int_vec(test_vector.size() * 2);
std::copy(reinterpret_cast<int*>(&(*test_vector.begin())),reinterpret_cast<int*>(&(*test_vector.end())),int_vec.begin());

さて、私の質問は - 上記のコードは安全ですか? そうでない場合、ループを書かずにそれを行うエレガントな方法はありますか?

4

4 に答える 4

5

std::transform ラムダ関数はどうですか?

std::vector<int> v;
std::transform(test_vector.begin(), test_vector.end(), std::back_inserter(v), 
               [&v](const std::pair<int, int> &p) 
               { v.push_back( p.first);
                 return p.second ;});

C++11 を使用できず、おそらくループを使用した線形コピーが「嫌い」な場合

次のようなファンクターを使用できます。

struct X{
    X(std::vector<int> &x) :v(x){}
    int operator () (const std::pair<int, int> &p)
    {
        v.push_back(p.first);
        return p.second;
    }
    std::vector<int> &v;
};

std::vector<int> v; //Final vector

std::transform(test_vector.begin(), 
               test_vector.end(), 
               std::back_inserter(v), 
               X(v));

std::vector<int> ::iterator it;

for(it=v.begin() ; it!=v.end() ;++it)
  std::cout<<*it<<" ";
于 2013-10-09T05:41:39.280 に答える