按迭代器位置进行矢量擦除
Vector Erase by Iterator Location
这里有一个向量,它包含一个它认为是素数的列表,然而,后面的一些值可以被列表中前面出现的一些值除。
为了修改这一点,我尝试在向量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);
}
}
}
相关文章:
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 如何使用 std::list 模板的迭代器擦除
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- 如何使用擦除和迭代器来删除二维向量中的项目
- C++ 矢量擦除推进迭代器
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- std::vector::erase() 真的会在擦除时使迭代器失效吗?
- 列出超出范围的擦除迭代器
- std::map 擦除 - 将迭代器传递给错误的映射
- 为什么擦除-删除成语不适用于反向迭代器
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- 矢量::擦除不适用于反向迭代器吗?
- 向量模板类:擦除(迭代器开始,迭代器端)
- 在向量和映射上执行擦除(迭代器)时观察到的不同行为
- 如何不擦除迭代器(从"Effective STL")
- 范围外的矢量擦除迭代器
- 范围之外的矢量擦除迭代器
- 删除并擦除迭代器
- 迭代器擦除 (迭代器在先,迭代器最后) 在 Visual C++ 2010 Express 下不起作用
- 在stl集合中移除迭代器时出现分割错误