C++ 如何使用擦除-删除习惯用法并在循环中增加迭代器?
我想循环遍历C++ 如何使用擦除-删除习惯用法并在循环中增加迭代器?,c++,c++11,C++,C++11,我想循环遍历向量,每次删除一项。我想我应该用这个。我相信向量上的erase会使其任何迭代器无效。如果是这样的话,我如何在while循环中使用这个习惯用法 下面是一个失败的例子: std::vector<int> vec = { 3, 6, 7, 5 }; auto itr = vec.begin(); while (itr != vec.end()) { // I'll remove a different element each iteration of the loo
向量
,每次删除一项。我想我应该用这个。我相信向量上的erase
会使其任何迭代器无效。如果是这样的话,我如何在while
循环中使用这个习惯用法
下面是一个失败的例子:
std::vector<int> vec = { 3, 6, 7, 5 };
auto itr = vec.begin();
while (itr != vec.end())
{
// I'll remove a different element each iteration of the loop.
// Hard-coded "7" here for simplicity:
auto position = std::remove(vec.begin(), vec.end(), 7);
vec.erase(position);
++itr;
}
std::vector vec={3,6,7,5};
自动itr=vec.begin();
while(itr!=vec.end())
{
//我将在循环的每次迭代中删除不同的元素。
//为简单起见,此处硬编码“7”:
auto position=std::remove(vec.begin(),vec.end(),7);
矢量擦除(位置);
++itr;
}
代码的目的是循环通过向量
,每次删除一个元素。我使用while
循环和迭代器,因为每次迭代后向量的大小都会改变。我将在每次迭代中删除最大的元素,但我不会为了使它更简单而显示代码。因此,元素将按以下顺序移除:7、6、5、3。同样,该代码没有显示。std::remove()
只需将指定值的所有元素(不是一个元素!)移动到容器的末尾,然后返回新的逻辑过去结束迭代器std::remove()
不会使迭代器无效,因为项目不会被物理删除,因此容器大小不会更改。仅移动容器内的值
在“删除”了所有要删除的内容后,您将在最后调用一次erase()
,从容器中实际删除这些项目
试试这个:
std::vector<int> vec = { 3, 6, 7, 5 };
auto itr = vec.begin();
auto end = vec.end();
while (itr != end)
{
end = std::remove(vec.begin(), end, ...);
++itr;
}
vec.erase(end, vec.end());
std::vector vec={3,6,7,5};
自动itr=vec.begin();
自动结束=向量结束();
while(itr!=结束)
{
end=std::remove(vec.begin(),end,…);
++itr;
}
向量擦除(end,vec.end());
此代码的用途是什么?你似乎对itr
什么都不做。擦除-删除习惯用法和vector::erase
是不同的东西,尽管后者可能使用前者……你是想随机删除列表中的一半项目吗?我编辑了这个问题以澄清我的目的。我还从std::find切换到std::remove。尝试从向量前面移除元素会降低性能,因为所有后面的元素都会下移以占用较低的插槽,每次都是O(n)。您最好使用链表而不是向量,或者启动第二个要保留的元素向量。我最后执行了而(!vec.empty())
并在每次迭代中删除元素。但是我还没有考虑过这种方式的性能。