Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

08.01.2012, 17:37. Просмотров 1272. Ответов 13
Метки нет (Все метки)

Хочу распечатать список 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);
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 17:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написание функции для for_each (C++):

c++ for_each и вызов функции - C++
for(microbe &amp;i : microbes) { i.set_speed(diapozon_speed * rand() /RAND_MAX + min_speed ); // установка скорости ...

Как можно получить итератор на элемент обрабатываемый в лямбде в функции for_each?STL - C++
Как можно получить итератор на элемент обрабатываемый в лямбде? for_each(arr.begin(), arr.end(), (char n) {if (n == dubl)...

Как вызвать метод для for_each? - C++
Здравствуйте. Мне нужно вызвать один метод для коллекции объектов. Что то вроде такого std::for_each( container.begin(),...

Ошибка при использовании for_each для вектора - C++
Здравствуйте, форумчане,при компиляции возникает ошибка: c:\program files\microsoft visual studio 10.0\vc\include\algorithm(22): error...

Написание функции для счета в динамическом массиве - C++
Нужно с помощью функций вывести динамический массив (это я сделал), посчитать к-во отрицательных чисел в каждой строке (это я тоже сделал),...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента - C++
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

13
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 17:40 #2
Объявить свою for_each?
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 17:47  [ТС] #3
soon, нет, заставить for_each работать с Print_name же. Это одно из заданий книги Страуструпа.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
08.01.2012, 17:51 #4
Gepar, глобальные переменные не подойдут?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 17:53 #5
А через класс/структуру можно?
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 18:00 #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/e97cd82f52f85d805737f931573637cc

Добавлено через 2 минуты
что такое std::bind() можешь прочесть тут: http://en.cppreference.com/w/cpp/utility/functional/bind
про std:: placeholders::_1, тут: http://en.cppreference.com/w/cpp/utility/functional/placeholders
3
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 18:00  [ТС] #7
soon, ну наверное можно, требование то написать Print_name.
niXman, а теперь так чтобы было понятно
Что такое placeholders::_1 в первую очередь интересует. Выглядит странно.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 18:02 #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);
}
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 18:11 #9
soon, в принципе, один из вариантов.
но лучше, имхо, отучаться от самопальных костылей.

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

Цитата Сообщение от soon Посмотреть сообщение
без них есть похожий изящный способ?
есть несколько способов. но в сравнении с std::bind() это жуткие костыли.
http://cplusplus.com/reference/std/functional/bind1st/
http://cplusplus.com/reference/std/functional/bind2nd/
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 19:01  [ТС] #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 мы оставляем в качестве упражнения."
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.01.2012, 19:34 #13
Цитата Сообщение от Gepar Посмотреть сообщение
у Страуструпа книга написана давно и стандартом 0x и не пахло тогда
это что, единственное что можно читать по плюсам?

Цитата Сообщение от Gepar Посмотреть сообщение
"Написание Print name мы оставляем в качестве упражнения."
а где говорится что это должна быть функция, а не конструирование объекта?
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 19:45  [ТС] #14
niXman, нигде не говориться, поэтому я на пред. странице ответил soon что это можно делать и через структуру/класс.
Цитата Сообщение от niXman Посмотреть сообщение
это что, единственное что можно читать по плюсам?
Нет конечно, просто читал и стало интересно как же это сделать можно, да и не вижу ничего плохого в книге Страуструпа, всё же он участвует в "развитии" с++ так что почему бы не почитать о с++ от того кто участвовал в его создании, книга конечно старая, но с тех пор не столь много всего поменялось да и возможностей только добавилось, а не уменьшилось так что код из его книги можно использовать и сейчас.
0
08.01.2012, 19:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 19:45
Привет! Вот еще темы с ответами:

For_each - C++
С помощью for_each, найти колличество иксов в массиве |{xi|xi&lt;3}| (Visual C++ 2005)

Метод в for_each - C++
Привет всем. Есть класс и структурка: struct Foo { Foo(): name(&quot;nx&quot;), val(9) {} string name; int...

for_each и деструкторы - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; class display { public: display() : i(0) { cout &lt;&lt; &quot;display...

Написание функции - C++
Ребята можете пожалуйста помочь с задачей? Написать функцию, которая возвращает строку, в которой все символы исходной строки...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru