Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос про STL'евский <functional>


Автор: Royan 24.8.2004, 20:42
Кто нибудь может мне разъяснить откуда берет 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;
}

Автор: bel_nikita 24.8.2004, 23:52
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"); // используется указатель на функцию
}

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

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

Имхо, operator() нужно константный сделать.

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

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

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

Автор: Vyacheslav 31.8.2004, 09:25
Алгоритм ничего не знает о твоем 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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)