矢量擦除范围内的元素
Vector erase elements from range
为什么程序停止了?那个程序编译,但如果我运行,他会中断,并给出一些关于迭代器向量不可增量的消息。 怎么了?
int main()
{
std::vector<int> vec;
for (int i = 1; i <= 100; ++i)
vec.push_back(i);
for (auto itr = vec.begin() + 5; itr < vec.end() - 5; ++itr)
vec.erase(itr);
for (const auto& itr : vec)
std::cout << itr << std::endl;
return 0;
}
你错了,因为函数擦除不会使迭代器无效。 所以你可以这样做:
auto itr = vec.begin() + 5;
while (itr != vec.end() - 5) {
itr = vec.erase(itr);
}
或更灵活(无环(
vec.erase(vec.begin() + 5, vec.end() - 5);
如果要使用 for 循环擦除向量中的元素,可以通过向后迭代元素集来实现。例如
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vec;
for (int i = 0; i <= 100; ++i)
vec.push_back(i);
for (auto itr = vec.end() - 6; itr > vec.begin() + 4; --itr)
vec.erase(itr);
for (const auto& itr : vec)
std::cout << itr << std::endl;
return 0;
}
正如 21koizyd 所指出的,如果要擦除一系列元素,可以使用std::vector::erase
的第二个参数来指定结束元素。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 对于多个查询,查找在 l 到 r 范围内具有相同元素的最长公共子数组
- 我应该如何使用remove_if删除两个数字范围内的元素
- 从给定范围内的向量中查找最大元素
- 矢量擦除范围内的元素
- 如何擦除矢量中的所有元素,但特定范围内最大的元素除外
- 如何在 std::map 中找到指定范围内的元素?
- 如果地图擦除范围内的第一个和最后一个相等,则是否删除该元素
- 如何在向量的给定索引范围内查找最小元素
- C++中数组范围内的有效元素计数
- 查找范围内元素数量的最快方法
- 元素在给定范围内的子矩阵中唯一元素的数目
- 替换排序范围内的元素
- 从矢量范围内删除特定元素
- 如何在C++中检查一个集合是否有某个范围内的元素
- 当C++试图访问向量的元素(在范围内)时,Qt Quick Windows应用程序崩溃
- 查找矢量中位于指定范围内的元素