C++11 C++;11:在向量中搜索对象的特定成员时删除惯用法

C++11 C++;11:在向量中搜索对象的特定成员时删除惯用法,c++11,erase,C++11,Erase,我知道擦除删除可用于删除与某个值匹配的元素,如下所示: v.erase(std::remove(v.begin(), v.end(), value), v.end()); 但是,如果我的向量有对象,并且我只需要删除其中一个变量与特定值匹配的对象,那么使用erase remove可以吗? 到目前为止,我一直在使用: auto i = vect.begin(); while (i!=vect.end()) if ((*i).field==someValue) i=vect.e

我知道擦除删除可用于删除与某个值匹配的元素,如下所示:

v.erase(std::remove(v.begin(), v.end(), value), v.end());
但是,如果我的向量有对象,并且我只需要删除其中一个变量与特定值匹配的对象,那么使用erase remove可以吗? 到目前为止,我一直在使用:

auto i = vect.begin();
while (i!=vect.end())
   if ((*i).field==someValue)
        i=vect.erase(i);
   else
      ++i;

有没有一种方法可以对erase remove执行相同的操作,或者这个while循环是正确的选择?

您可以使用标准算法而不是
std::remove

您可以使用标准算法而不是
std::remove
我避免直接编写erase remove,主要是因为如果错过了末尾的
容器.end()
,就会发生非常糟糕的事情

template<class C, class T>
void erase_remove( C& c, T&& t ) {
  using std::begin; using std::end;
  auto it = std::remove(begin(c), end(c), std::forward<T>(t));
  c.erase(it, end(c));
}
template<class C, class F>
void erase_remove_if( C& c, F&& f ) {
  using std::begin; using std::end;
  auto it = std::remove_if(begin(c), end(c), std::forward<F>(f));
  c.erase(it, end(c));
}
模板
无效删除(C&C、T&T){
使用std::begin;使用std::end;
自动it=std::remove(开始(c)、结束(c)、std::forward(t));
c、 擦除(它,结束(c));
}
模板
如果(C&C、F&F)无效删除{
使用std::begin;使用std::end;
auto it=std::remove_if(begin(c)、end(c)、std::forward(f));
c、 擦除(它,结束(c));
}

然后将测试
f
参数的成员变量的lambda传递到
erase\u remove\u if
我避免直接写入erase remove,这主要是因为如果错过了末尾的
container.end()
,就会发生非常糟糕的事情

template<class C, class T>
void erase_remove( C& c, T&& t ) {
  using std::begin; using std::end;
  auto it = std::remove(begin(c), end(c), std::forward<T>(t));
  c.erase(it, end(c));
}
template<class C, class F>
void erase_remove_if( C& c, F&& f ) {
  using std::begin; using std::end;
  auto it = std::remove_if(begin(c), end(c), std::forward<F>(f));
  c.erase(it, end(c));
}
模板
无效删除(C&C、T&T){
使用std::begin;使用std::end;
自动it=std::remove(开始(c)、结束(c)、std::forward(t));
c、 擦除(它,结束(c));
}
模板
如果(C&C、F&F)无效删除{
使用std::begin;使用std::end;
auto it=std::remove_if(begin(c)、end(c)、std::forward(f));
c、 擦除(它,结束(c));
}

然后将测试
f
参数的成员变量的lambda传递到
erase\u remove\u(如果

),我明白了!这会比我的while循环更安全或更好吗,或者我可以根据自己的喜好使用其中一个?谢谢。一般来说,使用标准算法比手动代码更清晰。例如,在您的代码中,您在迭代时修改
向量
;这将导致运行时出现问题。标准算法已经可以处理这个和其他“常见”问题,所以最好尽可能多地使用它们。原始的while循环是正确的。然而,主要的缺点是,每次删除一个元素时,向量中的以下所有元素都会移动(这需要
std::distance(it\u到\u removed\u element,end)
移动)。但是,
std::remove\u if
/
std::remove
使用巧妙的交换来避免不必要的移动。我明白了!这会比我的while循环更安全或更好吗,或者我可以根据自己的喜好使用其中一个?谢谢。一般来说,使用标准算法比手动代码更清晰。例如,在您的代码中,您在迭代时修改
向量
;这将导致运行时出现问题。标准算法已经可以处理这个和其他“常见”问题,所以最好尽可能多地使用它们。原始的while循环是正确的。然而,主要的缺点是,每次删除一个元素时,向量中的以下所有元素都会移动(这需要
std::distance(it\u到\u removed\u element,end)
移动)。但是,
std::remove\u if
/
std::remove
使用巧妙的交换来避免不必要的移动。