std :: erase和std :: remove组合以删除特定元素不适用于特定示例

用户名
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> a = {1,2,3,7,1,5,4};
    vector<int> b = {6,7,4,3,3,1,7};
    a.erase(remove(a.begin(),a.end(),a[0]),a.end());
    b.erase(remove(b.begin(),b.end(),b[0]),b.end());

    return 1;
}

对于此特定示例,我的GNU gdb Ubuntu 7.7.1声明在返回1行:a = {2,3,7,1,5,4}这是不期望的(仅删除一个1),b = {7 ,4,3,3,1}。

我的期望是b应该是a = 2,3,7,5,4和b = 7,4,3,3,1,7。

这里发生了什么事?

团队

的声明std::remove()看起来像

template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);

请注意,最后一个参数是参考。因此,在编译之后,它有效地传递了指定元素的地址。

通过remove(a.begin(), a.end(), a[0])a传入指示第0个元素的地址的东西remove()运行时,一旦处理了第0个元素,传入的引用所指向的值就会更改,从而导致意外结果。

为了获得预期的结果,请在致电之前进行复印std::remove()

int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.end());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么std :: forward_list ::: remove和std :: erase <std :: forward_list>具有不同的值类型?

从 BST 中删除节点不适用于 std::pair

std::bind 不适用于参考?

为什么std :: erase(std :: erase_if)不是<algorithm>中可用于任何容器的模板?

std :: merge不适用于std :: async

std :: bind不适用于std :: sort

使用std :: unique和vector.erase删除所有但最后一次出现的重复元素

使用std :: copy复制std :: list并使用std :: list :: erase删除

在std :: vector :: erase()和std :: deque :: erase()中复制/移动分配

std :: for_each和std :: execution :: par_unseq不适用于GCC,但适用于MSVC

C ++-std :: list.erase()不删除元素

无法删除std :: vector和std :: array?

重载的operator <<模板不适用于std :: list,尽管适用于std :: vector

为什么std :: begin()和std :: end()可用于固定数组,但不适用于动态数组?

std :: ofstrean不适用于-O3

std :: map查找不适用于C ++

lang不适用于std :: experimental :: optional

比率数学不适用于std :: chrono :: duration

用户定义的容器不适用于std :: ranges

javaout typemap不适用于指针的std :: vector

图片元素不适用于 onmouseover 和 onmouseout

使用名称空间和using指令不适用于std :: enable_if_t

std :: remove,std :: move(range)和移出元素

适用于(仅)插入和迭代的std容器

std :: merge和等元素顺序

gnuplot和std :: filesystem ::: remove

迭代时std :: multimap :: erase()

std :: vector :: erase与“交换并弹出”

C++ 中的 std::erase