提取向量的每个其他元素

use*_*193 6 c++ stdvector

有没有更快的方法将一个std::vectorin 分成两个半大小std::vectors(一个包含奇数索引的值,另一个包含偶数索引的值),而不是迭代原始向量并比较index%2==0每个索引?

hmj*_*mjd 17

我不确定什么意思更好但是如果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;
}
Run Code Online (Sandbox Code Playgroud)

参见在线演示http://ideone.com/pa9rW.

  • @jrok,不行。根据标准:_输入范围不得与任何一个输出范围重叠。 (2认同)

GWW*_*GWW 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());
}
Run Code Online (Sandbox Code Playgroud)

如多人的评论中所述,您必须检查向量是否为空.您可以通过在循环之前调整两个向量的大小来避免回推调用,即.

// 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());
}
Run Code Online (Sandbox Code Playgroud)

  • @Moritz这种方式每次迭代都可以保存分支和分区,因此我可以很容易地看到它更快.但如上所述,如果大小为零,则初始循环将运行多次迭代. (2认同)