通过循环遍历向量的最后一个元素

Sim*_*mon 1 c++ vector

我想循环遍历向量并擦除对应于特定条件的某些元素,例如:

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

myvector.push_back(1);
myvector.push_back(2);
myvector.push_back(3);
myvector.push_back(4);

for(it = myvector.begin(); it != myvector.end(); ++it){

    if((*it) == 4){
        it = myvector.erase(it);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个工作正常,除非标准删除了上面代码中的最后一项.你怎么避免这种行为?

谢谢.

编辑 - - - - - - - - - - - - - - - - - -

现在我循环它的原因是我需要从中删除元素实际上有4个向量(但标准仅在一个向量上):

在这种情况下,这是怎么走的?

vector<int> myvector;
vector<int> myvector2;
vector<int> myvector3;
vector<int> myvector4;
vector<int>::iterator it;
vector<int>::iterator it2;
vector<int>::iterator it3;
vector<int>::iterator it4;

myvector.push_back(1);
myvector.push_back(2);
myvector.push_back(3);
myvector.push_back(4);
Run Code Online (Sandbox Code Playgroud)

(假设myvector2/3/4中有值)

it2 = myvector2.begin()
it3 = myvector3.begin()
it4 = myvector4.begin()

for(it = myvector.begin(); it != myvector.end();){

    if((*it) == 4){
        it = myvector.erase(it);
        it2 = myvector2.erase(it2);
        it3 = myvector3.erase(it3);
        it4 = myvector4.erase(it4);
    }
    else{
    ++it;
    ++it2;
    ++it3;
    ++it4;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,擦除/删除习惯用法是否有效?

Jer*_*fin 5

通常是删除/擦除习惯用法,它看起来像这样:

myvector.erase(std::remove(myvector.begin(), myvector.end(), 4), myvector.end());
Run Code Online (Sandbox Code Playgroud)

编辑:重读你的问题,你提到"某些标准".如果条件不一定只是删除单个值,则可以使用std::remove_if而不是std::remove,并在仿函数中指定您的条件.

Edit2:对于处理四个向量的版本,通常的方法是创建一个包含四个相关值的结构,并删除整个结构:

struct x4 { 
    int a, b, c, d;

    // define equality based on the key field:
    bool operator==(x4 const &other) { return a == other.a; }

    x4(int a_, int b_=0, int c_=0, ind d_=0) : a(a_), b(b_), c(c_), d(d_) {}
};

std::vector<x4> myvector;

myvector.erase(std::remove(myvector.begin(), myvector.end(), x4(4));
Run Code Online (Sandbox Code Playgroud)

同样,如果您的标准比您在比较运算符中可以轻松表达的更复杂,则可以使用std::remove_if而不是std::remove.如果/当您可能需要在不同时间应用不同的标准时,这也很有用.

如果你真的需要将数据保存在并行向量中(例如,你将数据提供给需要单独的连续数组的外部数据),那么使用循环可能与替代方案一样好.