10

C++でstd::vector <>を取得し、それを他の2つのベクトルに半分に分割する簡単で実行時に効率的な方法はありますか?

今私はこれをしているので:

std::vector<> v1, v2;
for(int i = 0; i < vector.size(); i++)
{
    if(i < vector.size()/2) v1.push_back(vector[i]);
    else v2.push_back(vector[i]);
}

これはO(n)時間で実行され、これは私が頻繁に実行しなければならない操作です。それで、より良い方法はありますか?

4

1 に答える 1

13

本当に2つのベクトルが必要で、コメントでGManの提案を使用できない場合:

// where v1 is your original vector
std::vector<T> v2(
    std::make_move_iterator(v1.begin() + v1.size()/2),
    std::make_move_iterator(v1.end()));
v1.erase(v1.begin() + v1.size()/2, v1.end());

それはまだO(n)ですが、それ以上のことはできません。

元のベクトルを分離しておく必要がある場合:

std::vector<T> v2(v1.begin(), v1.begin() + v1.size()/2),
               v3(v1.begin() + v1.size()/2, v1.end());
于 2012-12-15T00:09:07.780 に答える