Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объекты функции, Не понятна логики 
:(
    Опции темы
GIK
Дата 26.9.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Всем доброго времени суток.
Читаю Страуструпа, дошел до такого кода:
Код

bool less_then_7(int u){
 return u<7;
}

void f(list<int> &c) {
list<int>::iterator p=find_if(c.begin(), c.end(), less_then_7);
}

Мне непонятна связь между переменной u и последовательностью c, понятно что используется логическая функция less_then_7, но как эта функция понимает что переменная u - это эдллемент последовательности?

ЗЫ Что неприятно в книге, так это то что полный код не приводится, и приходится думать больше.....


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
SergeCpp
Дата 26.9.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Файл ...\Include\algorithm
Код
        // TEMPLATE FUNCTION find_if
template<class _II, class _Pr> inline
    _II find_if(_II _F, _II _L, _Pr _P)
    {for (; _F != _L; ++_F)
        if (_P(*_F))
            break;
    return (_F); }

*_F — элемент последовательности
_P == less_than_7


Это сообщение отредактировал(а) SergeCpp - 26.9.2006, 14:31
PM MAIL WWW ICQ   Вверх
GIK
Дата 26.9.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Смутно понятно.... но постараюсь разобратся, спасибо.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Oleg_Ci
Дата 26.9.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Код

bool less_then_7(int u){
 return u<7;
}

void f(list<int> &c) {
list<int>::iterator p=find_if(c.begin(), c.end(), less_then_7);
}
Здесь у тебя используется алгоритм find_if, Он ищет позицию первого элемента(int) в контейнере list, для которого предикат( функция bool less_then_7 ) вернёт true. Т.е. ищет первый элемент который меньше 7, а итератор (list<int>::iterator p=) будет указывать на этот элемент.
Функция fint в отличии от find_if "ищет позицию значения"
Код

iterator p = find( c.begin(), c.end(), 5 ); // ищет число 5
Это просто для примера
PM MAIL   Вверх
GIK
Дата 26.9.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Олег4, спасибо smile  Вобщем это мне понятно, мне не понятно почему (как) переменная u связанна с объектом с?  Вроде функия less_then_7 отделна, да и переменная u создается в функции... Другое дело если бы в функцию отсылался каждый по очереди, элемент из c, тогда былобы все логично, а сейчас мне не видна связь. 


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Daevaorn
Дата 26.9.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(GIK @  26.9.2006,  17:15 Найти цитируемый пост)
Другое дело если бы в функцию отсылался каждый по очереди, элемент из c

так и есть, в качестве параметра
PM MAIL WWW   Вверх
Oleg_Ci
Дата 26.9.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Ну алгоритм берёт превое число из массива (c.begin() - указатель на первое число), и отправляет его в функцию less_then_7, и если функция вернёт true, то алгоритм возвращает итератор на это самое число, а если false - то берёт второе число и снова передаёт его функции less_then_7 и т.д. И если ничего не найдёт то возвращает итератор указывающий "за предел массива" ( с.end() )
Цитата(GIK @  26.9.2006,  20:15 Найти цитируемый пост)
не понятно почему (как) переменная u связанна с объектом с?
Это спрятано в нутри алгоритма, в принципе как я понимаю алгоритму передаётся интервал чисел ( от begin до end ) и пользовательская функция, которая вызывается из "внутренностей" алгоритма, и в эту самую функцию "пихает" числа из массива, и проверяет значение которое эта функция возвращает( true - false )
PM MAIL   Вверх
MAKCim
Дата 26.9.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Вроде функия less_then_7 отделна, да и переменная u создается в функции... Другое дело если бы в функцию отсылался каждый по очереди, элемент из c, тогда былобы все логично, а сейчас мне не видна связь.  

Так и получается
find_if в качестве предиката может использовать все что угодно, к чему можно обратиться с помощью ()
В данном случае тип второго шаблонного параметра find_if-а будет
либо bool (*)(int), либо bool (&)(int) (скорее второе)
Переменная u создается в стеке и равна значению текущей переменной из c


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GIK
Дата 27.9.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Народ спасибо, мне теперь все ясно smile  


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.