6

元のベクトルを反復処理してインデックスごとに if を比較するよりも、astd::vectorを 2 つのハーフサイズstd::vectors(1 つは奇数インデックスの値を含み、もう 1 つは偶数インデックスの値を含む)に分割するより速い方法はありますか?index%2==0

4

3 に答える 3

18

より良いとはどういう意味かはわかりませんが、C++ 11 の場合はstd::partition_copyを使用できます。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    std::vector<int> v1;
    for (int i = 0; i < 100; i++) v1.push_back(i);

    std::vector<int> v2;
    std::vector<int> v3;

    bool toggle = false;
    std::partition_copy(v1.begin(),
                        v1.end(),
                        std::back_inserter(v2),
                        std::back_inserter(v3),
                        [&toggle](int) { return toggle = !toggle; });

    std::cout << v2.size() << "\n";
    std::cout << v3.size() << "\n";

    return 0;
}

オンライン デモhttp://ideone.com/pa9rWを参照してください。

于 2012-08-22T14:43:08.563 に答える
6
// Make sure the vector is not empty
if(!v.empty()){
    for(size_t i = 0; i < (v.size() - 1); i+=2){
        v1.push_back(v[i]);
        v2.push_back(v[i + 1]);
    }

    if(v.size() % 2) v1.push_back(v.back());
}

複数の人のコメントで指摘されているように、ベクトルが空でないことを確認する必要があります。ループの前に両方のベクトルのサイズを変更することで、プッシュバック呼び出しを回避できます。

// Make sure the vector is not empty
if(!v.empty()){
    v1.resize((v.size() + 1) / 2);
    v2.resize(v.size() / 2);
    for(size_t i = 0, j = 0; i < (v.size() - 1); i+=2, j++){
        v1[j] = (v[i]);
        v2[j] = (v[i + 1]);
    }

    if(v.size() % 2) v1.push_back(v.back());
}
于 2012-08-22T14:33:52.867 に答える