0
#include <iostream>
#include <vector>
#include <algorithm> 

using namespace std;

void push_back(int v, vector<int>& coll) 
{
    coll.push_back(v); 
}

int main() 
{
    int a[] = {1, 2, 3, 4, 5};
    std::vector<int> b;
    for_each(a, a + 5, bind2nd(ptr_fun(push_back), b)); 
}

编译器说:

/usr/include/c++/4.1.2/bits/stl_function.h: In instantiation of ‘std::binder2nd<std::pointer_to_binary_function<int, std::vector<int, std::allocator<int> >&, void> >’:
tt5.cpp:15:   instantiated from here
/usr/include/c++/4.1.2/bits/stl_function.h:435: error: forming reference to reference type ‘std::vector<int, std::allocator<int> >&’
/usr/include/c++/4.1.2/bits/stl_function.h: In function ‘std::binder2nd<_Operation> std::bind2nd(const _Operation&, const _Tp&) [with _Operation = std::pointer_to_binary_function<int, std::vector<int, std::allocator<int> >&, void>, _Tp = std::vector<int, std::allocator<int> >]’:
tt5.cpp:15:   instantiated from here
/usr/include/c++/4.1.2/bits/stl_function.h:455: error: no matching function for call to ‘std::binder2nd<std::pointer_to_binary_function<int, std::vector<int, std::allocator<int> >&, void> >::binder2nd(const std::pointer_to_binary_function<int, std::vector<int, std::allocator<int> >&, void>&, std::vector<int, std::allocator<int> >&)’
/usr/include/c++/4.1.2/bits/stl_function.h:429: note: candidates are: std::binder2nd<std::pointer_to_binary_function<int, std::vector<int, std::allocator<int> >&, void> >::binder2nd(const std::binder2nd<std::pointer_to_binary_function<int, std::vector<int, std::allocator<int> >&, void> >&)
4

2 回答 2

5

您的程序非常好,只是您正在使用using namespace std;应该避免的程序。在这种情况下,这可能是导致问题的原因。

所以我建议你删除using namespace std;行,并尝试使用完全限定的名称,例如std::vectorstd::for_each

另一个解决方法可能是这样:只是不要使用std::for_each,因为你不需要它。

写这个:

int a[] = {1, 2, 3, 4, 5};
std::vector<int> b(a, a+5);

完毕!

现在,如果您想稍后插入更多项目,请执行以下操作:

int *c = get_n_items(n); //get n items 
b.insert(b.end(), c, c+n); //insert all items at end

希望有帮助。


你的真实场景:

正如你在评论中所说:

在我的实际工作中,源集合元素是一个对象。我只想从每个元素中提取一个成员数据并将它们插入到一个向量中。

如果是这种情况,那么您应该std::transform.

假设源是std::vector<person>并且您想从该源集合的每个元素中挑选 age成员数据,并将它们插入b其中vector<int>

std::vector<person> persons = get_persons();
std::transform(persons.begin(),        //input begin iterator
               persons.end(),          //input end iterator
               std::back_inserter(b),  //output iterator
               select_age);            //selector  

其中select_age定义为:

int select_age(person const & p) { return p.age; }

如果可以使用 C++11 的 lambda,那就简单多了:

std::transform(persons.begin(),        //input begin iterator
               persons.end(),          //input end iterator
               std::back_inserter(b),  //output iterator
               [](person const & p) {return p.age;});  //selector
于 2012-08-31T04:56:21.250 回答
0

方法1

void push_back(int v, vector<int>& coll)
{
    coll.push_back(v);
}

for_each(a, a + 5, bind2nd(ptr_fun(push_back), b));

方法2

#include <boost/bind.hpp>
#include <boost/ref.hpp>

for_each(a, a + 5, boost::bind(&vector<int>::push_back, boost::ref(b), _1));

方法3

copy (a, a+5, back_inserter(b));
于 2012-08-31T05:25:09.767 回答