我使用时它是否正常(无效)
vector<T> v;
v.erase(v.end());
Run Code Online (Sandbox Code Playgroud)
我想用类似的东西
v.erase(std::find(...));
Run Code Online (Sandbox Code Playgroud)
我应该if是v.end()还是不是?
在C++.com和CPPreference上没有关于它的信息
从STL中的集合中删除项目需要使用经常使用的技术,这已成为一种成语:擦除 - 删除 - 成语
这个成语最常见的用法之一是T从a中删除一个类型的项目vector<T>
std::vector<Widget> widget_collection;
Widget widget;
widget_collection.erase(
std::remove(widget_collection.begin(), widget_collection.end(), widget),
widget_collection.end());
Run Code Online (Sandbox Code Playgroud)
这显然非常冗长,违反了DRY原则 - 有问题的载体需要4次.
所以我的问题是为什么标准不提供方便助手?
就像是
widget_collection.erase_remove(widget);
Run Code Online (Sandbox Code Playgroud)
要么
std::erase_remove(widget_collection, widget);
Run Code Online (Sandbox Code Playgroud)
这显然可以扩展到
widget_collection.erase_remove_if(widget, pred);
Run Code Online (Sandbox Code Playgroud)
等等...
我创建了一个简单的C++程序来测试C++向量中erase()的行为.
这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
// your code goes here
vector<int> vec;
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
cout << vec[0] << " " << vec[1] << " " << vec[2] << endl;
vec.erase(vec.end());
//vec.erase(vec.begin());
cout << vec.size() << endl;
vec.push_back(12);
vec.push_back(10);
cout << vec[0] << " " << vec[1] << " " << vec[2] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是上面的代码在尝试擦除向量中的最后一个元素时给出了分段错误.但是当我使用begin()擦除第一个元素时,它工作正常.我无法理解它背后的原因.任何帮助将受到高度赞赏.