按迭代器位置进行矢量擦除

Vector Erase by Iterator Location

本文关键字:擦除 迭代器 位置      更新时间:2023-10-16

这里有一个向量,它包含一个它认为是素数的列表,然而,后面的一些值可以被列表中前面出现的一些值除。

为了修改这一点,我尝试在向量v周围迭代,如果它可以被向量中的另一个除,并且没有余数,则删除该值。

然而,我一直收到这个错误("没有匹配的成员函数可以调用擦除"),并且想不出任何其他方法来删除迭代器通过这个循环指向的值。有什么建议吗?

for (vector<int>::iterator it2 = v.begin();it2 != v.end(); ++it2){
    for (vector<int>::iterator it3 = v.begin();it3 != v.end(); ++it3){
        if (*it3%*it2 == 0){
            v.erase (*it2);
        }
    }
}

vector::erase采用迭代器。所以你需要:

v.erase(it2);

除此之外,vector::erase会在擦除点或擦除点之后使迭代器和引用无效,包括end()迭代器,因此您需要更新迭代器:

if (*it3 % *it2 == 0) {
    auto it3index = it3 - v.begin();
    it2 = v.erase(it2);
    it3 = v.begin() + it3index;
}

或者,您可以通过不使用迭代器来简化整个过程:

for (unsigned i = 0; i < v.size(); ++i) {
    for (unsigned j = 0; j < v.size(); ++j) {
        if (v.at(j) % v.at(i) == 0) {
            v.erase(v.begin() + i);
        }
    }
}