почему я не могу поставить "cout <<" в качестве аргумента функции в for_each? - PullRequest
1 голос
/ 02 мая 2011
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 ]

15 голосов
/ 02 мая 2011

Поскольку это функция-член, а 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_fun и std::bind1st (или любой из лучших альтернатив C ++ 0x / boost) для генерации этой функции.

Но лучше всего было бы использовать std::copy с std::ostream_iterator:

std::copy(my_ints.begin(), my_ints.end(), std::ostream_iterator<int>(std::cout));
3 голосов
/ 02 мая 2011

std::for_each требуется функция с единственным параметром, элементом контейнера, по которому вы перебираете. Однако для operator << требуются два параметра: левая и правая части оператора. Так что вещи не совпадают.

Вы должны каким-то образом связать параметр ostream, чтобы снова перейти к одному параметру. boost::bind - это один из способов, или вы можете просто определить пользовательскую функцию с одним аргументом и передать ее.

2 голосов
/ 02 мая 2011

for_each принимает функцию в качестве последнего аргумента для применения к элементам диапазона, определение функции должно делать то, что вы

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

тогда

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

если это то, что вы пытаетесь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...