我有一个整数对向量。假设 Itr 作为这个向量的迭代器。我想遍历向量并决定是否从向量中删除该元素。如果向量的元素是9001,3
那么我想从itr->first
为 9001 的向量中删除所有元素(无论itr->second
是什么)。
问题:
- 如何删除这个整数对向量。以下方法不起作用:
vec.erase(std::remove(vec.begin(), vec.end(), Itr->first=9001), vec.end());
- 与其给 vec.begin() 一个范围作为 vec.begin() 到 vec.end(),我是否可以给vec.begin as
(current element being pointer by vector) - 10
andve.end 饰(current element being pointed by vector)+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;
如何删除这个整数对向量。以下方法不起作用:
将 lambda 或自定义比较器与remove_if
算法结合使用:
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());
与其给 vec.begin() 一个范围作为 vec.begin() 到 vec.end() 我是否可以给 vec.begin 作为
(current element being pointer by vector) - 10
和ve.end as (current element being pointed by vector)+10
?
是的。矢量迭代器支持指针算法,因此很容易。
如果向量大小本身小于 10,则 Itr+10 ot Itr-10 可能会导致分割错误。那么如何处理这种情况呢?
如果在迭代器之前或之后没有足够的元素,请固定您的范围:
//iter is an iterator to vector
//vec is instance of std::vector
//replace auto with std::vector<std::pair<int,int> >::iterator for non C++11 compilers
auto begin = iter - std::min(10, iter - vec.begin());
auto end = iter + std::min(10, vec.end() - iter);