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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про STL'евский <functional> 
:(
    Опции темы
Royan
  Дата 24.8.2004, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Кто нибудь может мне разъяснить откуда берет less<int>( ) парметры? Речь идет о выделенной строке в примере приведенном ниже:

Цитата
// functional_less.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <iostream>

int main( )
{
  using namespace std;
  vector <int> v1;
  vector <int>::iterator Iter1;
  vector <int>::reverse_iterator rIter1;

  int i;
  for ( i = 0 ; i < 7 ; i++ )
  {
      v1.push_back( rand( ) );
  }

  cout << "Original vector v1 = ( " ;
  for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
  cout << ")" << endl;

  // To sort in ascending order,
  // use the (default) binary predicate less<int>( )
  sort( v1.begin( ), v1.end( ), less<int>( ) );  // could have written simply: sort( v1.begin( ), v1.end( ) );
  cout << "Sorted vector v1 = ( " ;
  for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
  cout << ")" << endl;
}



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
bel_nikita
  Дата 24.8.2004, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Royan
Это предикат.
Предикат является указателем на функцию, или объектом-функцией, т.е. объектом, в котором определен оператор вызова функции, то бишь operator(). Предикат может быть унарным или бинарным. У унарного предиката один аргумент, а у бинарного - два. Возвращаемым значением предиката(т.е. функцией или объектом-функцией) является значения истина или ложь.
Вот еще такой примерчик приведу:
Цитата
class less
{
public:
  bool operator()(int const &x, int const &y)
  {
    return x<y;
  }
};

bool LESS(int const &x, int const &y)
{
  return x<y;
}

template<typename T>
bool compare(int const &x, int const &y, T &ptr)
{
  return ptr(x,y);
}

int main(int argc, char* argv[])
{
  if ( compare(1,2,less()) ) printf("\nURA 1"); // используется объект-функция
  if ( compare(1,2,LESS) )  printf("\nURA 2"); // используется указатель на функцию
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Yuri Burger
Дата 25.8.2004, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 11.5.2004

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



Цитата(bel_nikita @ 24.8.2004, 23:52)
Royan
Вот еще такой примерчик приведу:

{
public:
  bool operator()(int const &x, int const &y)
  {
    return x<y;
  }
};

Имхо, operator() нужно константный сделать.
PM MAIL   Вверх
Royan
Дата 30.8.2004, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Я только не понял одной вещи что такое с точки зрения языка объект функция? И чем тогда operator()() отличается от SomeMethod()? Поясню вопрос, пусть есть класс:

class B{
public:
void SomeMethod(void){
//blah blah blah
};
};

Я ж не могу вызвать SomeMethod не инстанциировав объект типа B, но выходит могу вызвать operator()() qstn.gif


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Vyacheslav
Дата 31.8.2004, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 59



Алгоритм ничего не знает о твоем SomeMethod, зато знает, что должен быть оператор ()

Добавлено @ 09:33
Цитата(Royan @ 30.8.2004, 17:34)

Я ж не могу вызвать SomeMethod не инстанциировав объект типа B, но выходит могу вызвать operator()() qstn.gif

Ты не можешь вызвать и оператор , не инстанцировав объкт
Ты по всей видимости ,путаешь конструктор с вызвовом оператора ()
Код

sort( v1.begin( ), v1.end( ), less<int>( ) );

Здесь less<int>( ) - это вызов конструктора. Сравни c

Код

less<int> compare;
sort(v.begin(), v.end(), compare);


Оператор () вызывается внутри sort.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW 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.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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