Форум программистов, компьютерный форум CyberForum.ru

Написание функции для for_each - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
08.01.2012, 17:37     Написание функции для for_each #1
Хочу распечатать список list через свою функцию используя for_each, но я не могу понять как заставить эту for_each работать с моей фукнкцией, которая принимает на один аргумент, а два. Пример теоретический, естественно здесь можно список list более изящно распечатать, но интересует именно написание функции для for_each с двумя аргументами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
using namespace std;
 
void Print_name(ostream& out,const string &str)
{
    out<<str<<' ';
};
 
void extract_and_print(const list<string>& ls)
{
    for_each(ls.begin(),ls.end(),Print_name(cout));//ошибка, вызов функции Print_name с не верным количеством аргументов
}
 
int main ()
{
    list<string> myList;
    myList.push_back("text");
    myList.push_back("text");
    myList.push_back("text");
    extract_and_print(myList);
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 17:37     Написание функции для for_each
Посмотрите здесь:

For_each C++
for_each и деструкторы C++
C++ метод в for_each
C++ Как вызвать метод для for_each?
C++ c++ for_each и вызов функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 17:40     Написание функции для for_each #2
Объявить свою for_each?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
08.01.2012, 17:47  [ТС]     Написание функции для for_each #3
soon, нет, заставить for_each работать с Print_name же. Это одно из заданий книги Страуструпа.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
08.01.2012, 17:51     Написание функции для for_each #4
Gepar, глобальные переменные не подойдут?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 17:53     Написание функции для for_each #5
А через класс/структуру можно?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 18:00     Написание функции для for_each #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
#include <functional>
using namespace std;
 
void Print_name(ostream& out,const string &str)
{
    out<<str<<' ';
};
 
void extract_and_print(const list<string>& ls)
{
    for_each(ls.begin(),ls.end(),bind(&Print_name, ref(cout), placeholders::_1));//ошибка, вызов функции Print_name с не верным количеством аргументов
}
 
int main ()
{
    list<string> myList;
    myList.push_back("text");
    myList.push_back("text");
    myList.push_back("text");
    extract_and_print(myList);
}
http://liveworkspace.org/code/e97cd8...37f931573637cc

Добавлено через 2 минуты
что такое std::bind() можешь прочесть тут: http://en.cppreference.com/w/cpp/uti...unctional/bind
про std:: placeholders::_1, тут: http://en.cppreference.com/w/cpp/uti...l/placeholders
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
08.01.2012, 18:00  [ТС]     Написание функции для for_each #7
soon, ну наверное можно, требование то написать Print_name.
niXman, а теперь так чтобы было понятно
Что такое placeholders::_1 в первую очередь интересует. Выглядит странно.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 18:02     Написание функции для for_each #8
Цитата Сообщение от Gepar Посмотреть сообщение
ну наверное можно, требование то написать Print_name.
Нет. Я планировал перегрузить () для структуры. Так что print_name там не было бы. А было бы что-то вроде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
 
template <class Stream, class T> class myClass
{
    Stream& stream;
    
public:
    myClass(Stream& s): stream(s)
    {
        
    }
    
    Stream& operator() (T num)
    {
        stream << num;
        return stream;
    }
};
 
/*void Print_name(std::ostream& out,const string &str)
{
    out<<str<<' ';
};*/
 
void extract_and_print(const std::list<std::string>& ls)
{
    //myClass<std::ostream, std::string> f(std::cout);
    for_each(ls.begin(),ls.end(), myClass<std::ostream, std::string>(std::cout));//ошибка, вызов функции Print_name с не верным количеством аргументов
}
 
int main ()
{
    std::list<std::string> myList;
    myList.push_back("text");
    myList.push_back("text");
    myList.push_back("text");
    extract_and_print(myList);
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 18:11     Написание функции для for_each #9
soon, в принципе, один из вариантов.
но лучше, имхо, отучаться от самопальных костылей.

Добавлено через 5 минут
ах да. про std::ref()/std::cref() забыл.
в офф доке их описание пока не появилось. сегодня напишу.
читать пока из бустовой доки: http://www.boost.org/doc/libs/1_48_0/doc/html/ref.html
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 18:13     Написание функции для for_each #10
niXman, а это, вроде, нововведения C++0x. А без них есть похожий изящный способ?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 18:17     Написание функции для for_each #11
Цитата Сообщение от soon Посмотреть сообщение
нововведения C++0x
если правильно: текущий стандарт С++11.
т.е. уже не нововведение.

Цитата Сообщение от soon Посмотреть сообщение
без них есть похожий изящный способ?
есть несколько способов. но в сравнении с std::bind() это жуткие костыли.
http://cplusplus.com/reference/std/functional/bind1st/
http://cplusplus.com/reference/std/functional/bind2nd/
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
08.01.2012, 19:01  [ТС]     Написание функции для for_each #12
Это всё конечно хорошо, но у Страуструпа книга написана давно и стандартом 0x и не пахло тогда, не говоря уж о стандарте 2011 года.
soon, ну твой вариант возможен, но у Страуструпа написан вызов функции вида
C++
1
for_each(ls.begin(),ls.end(),Print_name(cout));
,а саму функцию предлагает он дописать. 18.5.1 в конце та где list<*Person> у него это если имеется такая книга.

Ну или вот код из его примера полностью
C++
1
2
3
4
5
6
void extract_and_print (const list<Club>& lc) 
{ 
list<Person*> off; 
extract (lc, off) ; 
for each (off, begin () , off, end () , Print name (cout) ) ; 
}
Примечание из книги: "Написание Print name мы оставляем в качестве упражнения."
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 19:34     Написание функции для for_each #13
Цитата Сообщение от Gepar Посмотреть сообщение
у Страуструпа книга написана давно и стандартом 0x и не пахло тогда
это что, единственное что можно читать по плюсам?

Цитата Сообщение от Gepar Посмотреть сообщение
"Написание Print name мы оставляем в качестве упражнения."
а где говорится что это должна быть функция, а не конструирование объекта?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 19:45     Написание функции для for_each
Еще ссылки по теме:

C++ Написание функции для счета в динамическом массиве
For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента C++
Ошибка при использовании for_each для вектора C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
08.01.2012, 19:45  [ТС]     Написание функции для for_each #14
niXman, нигде не говориться, поэтому я на пред. странице ответил soon что это можно делать и через структуру/класс.
Цитата Сообщение от niXman Посмотреть сообщение
это что, единственное что можно читать по плюсам?
Нет конечно, просто читал и стало интересно как же это сделать можно, да и не вижу ничего плохого в книге Страуструпа, всё же он участвует в "развитии" с++ так что почему бы не почитать о с++ от того кто участвовал в его создании, книга конечно старая, но с тех пор не столь много всего поменялось да и возможностей только добавилось, а не уменьшилось так что код из его книги можно использовать и сейчас.
Yandex
Объявления
08.01.2012, 19:45     Написание функции для for_each
Ответ Создать тему
Опции темы

Текущее время: 00:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru