C++ vector.erase和std::在自定义向量上删除
我有一个int对向量。假设Itr是这个向量的迭代器。 我想迭代向量并决定是否从向量中删除元素。如果向量的元素是C++ vector.erase和std::在自定义向量上删除,c++,vector,stl,C++,Vector,Stl,我有一个int对向量。假设Itr是这个向量的迭代器。 我想迭代向量并决定是否从向量中删除元素。如果向量的元素是9001,3,那么我想从向量中删除itr->first为9001的所有元素(不管itr->second是什么) 问题: 如何移除这个int对向量。以下方法行不通: vec.erase(std::remove(vec.begin(),vec.end(),Itr->first=9001),vec.end()) 我可以给出一个从vec.begin()到vec.end()的范围吗 vec.beg
9001,3
,那么我想从向量中删除itr->first
为9001的所有元素(不管itr->second是什么)
问题:
如何移除这个int对向量。以下方法行不通:
vec.erase(std::remove(vec.begin(),vec.end(),Itr->first=9001),vec.end())代码>
我可以给出一个从vec.begin()到vec.end()的范围吗
vec.begin as(当前元素是向量指针)-10
和
ve.end为(当前元素由向量指向)+10
李>
示例:vec.erase(std::remove(Itr-10,Itr+10,Itr->first=9001),vec.end()代码>
如果向量大小本身小于10,Itr+10 ot Itr-10可能会导致分段错误。那么如何应对这种情况呢
vector<pair<int,int> > vec;
vec.push_back(pair<int,int>(9001,1));
vec.push_back(pair<int,int>(9001,2));
vec.push_back(pair<int,int>(9001,3));
vec.push_back(pair<int,int>(9001,4));
vec.push_back(pair<int,int>(9002,1));
vec.push_back(pair<int,int>(9002,2));
vec.push_back(pair<int,int>(9002,3));
vec.push_back(pair<int,int>(9002,4));
vec.push_back(pair<int,int>(9002,5));
vector<pair<int,int> >::iterator Itr;
for(Itr=vec.begin();Itr!=vec.end();++Itr)
cout<<vecItr->first<<" "<<vecItr->second;
// vec.erase(std::remove(Itr-10, Itr+10, Itr->first=9001), vec.end()); //This doest work
for(Itr=vec.begin();Itr!=vec.end();++Itr)
cout<<Itr->first<<" "<<Itr->second;
vec;
向量推回(成对(9001,1));
向量推回(成对(9001,2));
向量推回(成对(9001,3));
向量推回(成对(9001,4));
向量推回(成对(9002,1));
向量推回(成对(9002,2));
向量推回(成对(9002,3));
向量推回(成对(9002,4));
向量推回(成对(9002,5));
向量::迭代器Itr;
对于(Itr=vec.begin();Itr!=vec.end();++Itr)
库特
如何移除这个int对向量。以下方法行不通:
如果算法:
vec.erase(std::remove_if(vec.begin(), vec.end(),
[](auto& elem){ return elem.first == 9001;} ),
vec.end());
使用自定义比较器:
struct elem_equals
{
typedef std::pair<int,int> elem_t
const int value;
elem_equals(int v) : value(v) {}
bool operator()(elem_t& elem)
{
return elem.first == value;
}
};
//...
vec.erase(std::remove_if(vec.begin(), vec.end(),
elem_equals(9001) ),
vec.end());
如何移除这个int对向量。以下方法行不通:
如果算法:
vec.erase(std::remove_if(vec.begin(), vec.end(),
[](auto& elem){ return elem.first == 9001;} ),
vec.end());
使用自定义比较器:
struct elem_equals
{
typedef std::pair<int,int> elem_t
const int value;
elem_equals(int v) : value(v) {}
bool operator()(elem_t& elem)
{
return elem.first == value;
}
};
//...
vec.erase(std::remove_if(vec.begin(), vec.end(),
elem_equals(9001) ),
vec.end());
使用适当的lambda如何?使用适当的lambda如何?lambda不接收迭代器,而是接收实际的元素。在lambda参数中使用auto是c++14。@stefaanv谢谢,修复了。对于C++14,没有不使用它的要求。但无论如何我都会改变它。不幸的是,我不在C++11或更高版本上使用lambda。我还有其他选择吗?@anurag86,当然,自定义比较器。我现在将编辑我的答案并添加示例我并不是说你不应该使用C++14,我只是向那些尝试你的示例的人指出。1中的2个注释可能有点混淆。lambda不接收迭代器,而是接收实际元素。在lambda参数中使用auto是c++14。@stefaanv谢谢,修复了。对于C++14,没有不使用它的要求。但无论如何我都会改变它。不幸的是,我不在C++11或更高版本上使用lambda。我还有其他选择吗?@anurag86,当然,自定义比较器。我现在将编辑我的答案并添加示例我并不是说你不应该使用C++14,我只是向那些尝试你的示例的人指出。1中的2个备注可能有点混淆。