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
为什么会这样?不应该只删除矢量的第一个元素吗? 我想std :: remove不会停留在第一个元素,而是遍历整个向量.有没有什么方法可以使用非独特元素的集合上的擦除删除习惯用法? 解决方法
std :: remove的第三个参数是一个const引用.当您移动元素时,您正在更改引用的元素的值,从而导致未定义的行为.
这表现得很好: auto elem = vec.front(); // copy front element vec.erase(std::remove(std::begin(vec),elem),std::end(vec)); 输出:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |