加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在非唯一集合上使用erase-remove惯用法

发布时间:2020-12-16 09:49:56 所属栏目:百科 来源:网络整理
导读:#include iostream#include vector#include algorithmint main(){ enum class En{A,B}; std::vectorEn vec{En::A,En::B,En::A,En::A}; for(const auto i : vec) std::cout int(i) ","; std::cout std::endl; vec.erase(std::remove(std::begin(vec),std::end
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    enum class En{A,B};
    std::vector<En> vec{En::A,En::B,En::A,En::A};

    for(const auto& i : vec) std::cout << int(i) << ",";
    std::cout << std::endl;

    vec.erase(std::remove(std::begin(vec),std::end(vec),vec.front()),std::end(vec));

    for(const auto& i : vec) std::cout << int(i) << ",";
    std::cout << std::endl;

    return 0;
}

Ideone:http://ideone.com/NTPVyE

Prints:

0,1,

1,

为什么会这样?不应该只删除矢量的第一个元素吗?

我想std :: remove不会停留在第一个元素,而是遍历整个向量.有没有什么方法可以使用非独特元素的集合上的擦除删除习惯用法?

解决方法

std :: remove的第三个参数是一个const引用.当您移动元素时,您正在更改引用的元素的值,从而导致未定义的行为.

这表现得很好:

auto elem = vec.front(); // copy front element
vec.erase(std::remove(std::begin(vec),elem),std::end(vec));

输出:

1,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读