为什么我不能把“cout<<”作为for_each中的函数参数?

时间:2011-05-02 18:21:38

标签: c++ stl

std::vector<int> my_ints;
my_ints.push_back(1);
my_ints.push_back(2);
my_ints.push_back(3);
my_ints.push_back(4);

std::for_each(my_ints.begin(), my_ints.end(), std::cout.operator <<); 

3 个答案:

答案 0 :(得分:15)

因为那是一个成员函数,而for_each想要一个带有单个参数的函数对象。

你必须编写自己的函数:

void print_to_stdout(int i)
{
    std::cout << i;
}
std::for_each(my_ints.begin(), my_ints.end(), print_to_stdout); 

另一种方法是混合std::mem_funstd::bind1st(或任何更好的C ++ 0x / boost替代品)来生成该函数。

但最好的方法是将std::copystd::ostream_iterator

一起使用
std::copy(my_ints.begin(), my_ints.end(), std::ostream_iterator<int>(std::cout));

答案 1 :(得分:3)

std::for_each需要一个具有单个参数的函数,即您正在迭代的容器元素。但是,operator <<需要两个参数,即操作符的左侧和右侧。所以事情没有排好。

您必须以某种方式绑定ostream参数,以便再次使用单个参数。 boost::bind是单向的,或者你可以定义一个自定义的单个参数函数并传递它。

答案 2 :(得分:2)

for_each接受一个函数作为要应用于范围元素的最后一个参数, 定义一个函数应该做什么

void print(int i){
  cout << i << endl;
}

然后

for_each(vector.begin(), vector.end(), print)

如果这是你正在尝试的......