C++ 为什么std::删除共享的\u ptr<;T>;是谓词吗?

C++ 为什么std::删除共享的\u ptr<;T>;是谓词吗?,c++,c++11,C++,C++11,下面是一个简单的例子: #include <iostream> #include <memory> #include <vector> #include <algorithm> using namespace std; struct foo {}; int main(void) { vector<shared_ptr<foo>> v; auto f1 = make_shared<foo>();

下面是一个简单的例子:

#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

using namespace std;

struct foo
{};


int main(void)
{
  vector<shared_ptr<foo>> v;

  auto f1 = make_shared<foo>();
  auto f2 = make_shared<foo>();
  auto f3 = make_shared<foo>();
  auto f4 = make_shared<foo>();

  v.push_back(f1);
  v.push_back(f2);
  v.push_back(f3);
  v.push_back(f4);

  cout << v.size() << endl;

  v.erase(remove_if(begin(v), end(v), f2), end(v));

  cout << v.size() << endl;
}

因为这就是
删除\u如果
所做的;第三个参数是一个谓词,用于测试是否删除元素。您的代码可能无法编译,因为不能像函数一样调用
shared_ptr


如果要删除具有特定值的元素,请使用。

以及
std::shared\u ptr
如何作为谓词?我原以为如果没有
操作符()
.arrggh,这将无法编译!!!刚刚注意到血腥的文档(在cppreference的同一页上…)@光明赛道:不是。但是
remove\u如果
将尝试将其视为一个,可能无法编译。@Mike:好吧,公平地说,我想,OP实际上并没有说他的代码可以编译。@Nim:其他人可能会遇到同样的问题-我不认为这个问题需要删除。另外,希望未来的标准中会出现一些形式的概念,使程序员更容易理解在这种情况下他们做错了什么。如果使用一些编译器输出和您期望的输出,这种混淆会更清楚。此代码不会编译。我不明白为什么我会删除,但是迈克已经回答正确了,所以我不会删除,但是如果它真的关闭了,那就这样吧。@Nim你可以修复它,只要提到错误就行了。然后,它是一个搜索入口点,用于尝试使用remove_if删除项目,但不需要谓词且不知道remove的人。这只是一个重要的疏忽,更不用说代码没有编译…@TonyD:当OP只是犯了一个愚蠢的错误和/或没有阅读文档和/或拼写错误和/或诸如此类的时候,就使用了这个接近的理由。在评论中,它通常伴随着“哦,愚蠢的我”或“哦”(见下文)。该问题是OP未能阅读XYZ文档所特有的,因此,该问题不太可能与任何其他人相关。请记住,这是一个信息存储库,而不是个人帮助台。
In file included from /usr/local/gcc/4.8.2/include/c++/4.8/algorithm:62:0,
                 from remove_if.cpp:4:
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h: In instantiation of '_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]':
remove_if.cpp:29:41:   required from here
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:1150:33: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
         if(!bool(__pred(*__first)))
                                 ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h: In instantiation of '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]':
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:4465:41:   required from '_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]'
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:1144:64:   required from '_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]'
remove_if.cpp:29:41:   required from here
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:214:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))
                       ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:218:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))
                       ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:222:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))
                       ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:226:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))
                       ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:234:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))
                       ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:238:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))
                       ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:242:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)'
    if (__pred(*__first))