Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用擦除-删除习惯用法并在循环中增加迭代器?_C++_C++11 - Fatal编程技术网

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())
并在每次迭代中删除元素。但是我还没有考虑过这种方式的性能。