Функторы. Namespaces — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
Строка 1: Строка 1:
 +
== Функторы(2 часть) ==
 +
 +
 
find_if (p, q, Func)
 
find_if (p, q, Func)
  
Строка 81: Строка 84:
  
  
<nowiki><nowiki>Вставляйте сюда неотформатированный текст.</nowiki></nowiki>
+
 
 +
== Namespaces ==
 +
 
 +
int max(int, int)
 +
double max(double, double)
 +
namespace au
 +
{
 +
    void f(){}
 +
}
 +
 
 +
Чтобы вызвать f, нужно написать au::f();
 +
 
 +
namespace noc
 +
{
 +
  void g(){}
 +
}
 +
namespace au
 +
{
 +
  void g(){}
 +
}
 +
 
 +
namespace не является чем-то целостным
 +
 
 +
namespace Ru{
 +
  namespace Spb{
 +
  namespace au{
 +
    int f();
 +
  }
 +
  }
 +
  namespave msk{}
 +
}
 +
 +
Ru::spb::au::f();
 +
 
 +
Для обращения к функции из глобального namespace нужно ::f();
 +
 
 +
Если в msk, будет еще Ru, то чтобы ***** из msk надо будет писать не Ru::spb, а ::Ru::spb. (коллизия двух Ru)
 +
 
 +
Поиск
 +
--ищет имя в текущем namespace
 +
--если не нашли переходим выше, если нашли запускаем перегрузку
 +
 
 +
namespace Ru
 +
{
 +
  определно g(a,b)
 +
  namespace spb
 +
  {
 +
      определено g(a)
 +
      namesapce spbtele
 +
      { вызываем g(a,b) }
 +
  }
 +
  namespace msk{}
 +
}
 +
В предыдущем примере поиск остановиться в spb. Поскольку там тоде есть g.
 +
Поиск ищет только имя!
 +
 
 +
Чтобы избежать такое, надо в spb записать
 +
  using ::Ru::g;
 +
 
 +
%часть текста которую сложно расшифровать
 +
 
 +
НЕ НАДО=НЕЛЬЗЯ писать using namespave std;
 +
 
 +
Безымянный namespace
 +
 
 +
namespace {}
 +
появиться уникальный namespace для каждого .cpp файла. Это позвляет создавать меленькие структуры не боясь перекрытия имен.
 +
 
 +
namespace a=ru::spb::au
 +
 
 +
И тогда можно будет писать a::f();.
 +
 
 +
ADL=argument dependent look up
 +
 
 +
namespace g
 +
{
 +
  strcut complex{};
 +
  complex operator+();
 +
}
 +
g::a+b  %написано что-то непонятное
 +
а=g::operator+(a,b)
 +
 
 +
Поиск имен ***** там где мы находимся, а также и в namespace аргументов(это первый шаг)
 +
 
 +
Поиск Кенига.

Версия 14:19, 29 мая 2011

Функторы(2 часть)

find_if (p, q, Func)

struct Divby7
{
   bool operator()(int i)const
   {
    return i%7==0;
   }
};
struct Divby
{
 Divby(int k) : k(k){}
 bool operator()(int i) const
 {
   return i%k==0;
 }
 const int k;
};

Можно писать Find_if(p,q,Divby(5)).


stable_sort(p,qcomp_by_abs())
structcomp_by_abs
{
 bool operator()(int a, int b)const
 {
   return abs(a)<abs(b);
 }
};
}

Divby - унарный предикат. comp_by_abs - бинарный предикат.

transform(p,q,out, add(7));

struct add
{
 add(int k): k(k){}
 int operator()(int a)const
 {
   return a+7;
 }
};

Стандартные функторы: minus, plus, divides, modulus, mulutiplies, logical_and, logical_or, logical_not. Бинарные предикаты(шаблонные) less, greater, less_equal, greater_equal, not_equal_to, equal_to.

find_if(p,q,bind1st(not_equal_to<int>(),7));

bind2nd

find_if(p,q,bind2nd(greater<int>(),7)) -- первый больший 7.

Кроме bind1st, bind2nd есть еще not1, not2.

struct Divby : unary_function<bool, int> { } если хоти чтобы с этим работали bind1st, bind2nd, not1, not2

Аналогично struct comp_by_abs::binary_function<bool, int, int>;

mem_fun mem_fun_ref ptr_fun for_each(p,q, mem_fun_ref(vector<int>::clear))

mem_fun - для указателей mem_fun_ref - для ссылок ptr_fun - для любой функции

Можно not1(ptr_fun(is_add()))

Библиотека boost::bind boost::bind(vector<int>::resize,_1, 100,3);


Namespaces

int max(int, int)
double max(double, double)
namespace au
{
   void f(){}
}

Чтобы вызвать f, нужно написать au::f();

namespace noc
{
 void g(){} 
}
namespace au
{
  void g(){}
}

namespace не является чем-то целостным

namespace Ru{
 namespace Spb{
  namespace au{
   int f();
  }
 }
 namespave msk{}
}

Ru::spb::au::f();

Для обращения к функции из глобального namespace нужно ::f();

Если в msk, будет еще Ru, то чтобы ***** из msk надо будет писать не Ru::spb, а ::Ru::spb. (коллизия двух Ru)

Поиск --ищет имя в текущем namespace --если не нашли переходим выше, если нашли запускаем перегрузку

namespace Ru
{
 определно g(a,b)
 namespace spb
  {
     определено g(a) 
     namesapce spbtele
     { вызываем g(a,b) }
  }
 namespace msk{}
}

В предыдущем примере поиск остановиться в spb. Поскольку там тоде есть g. Поиск ищет только имя!

Чтобы избежать такое, надо в spb записать

 using ::Ru::g;

%часть текста которую сложно расшифровать

НЕ НАДО=НЕЛЬЗЯ писать using namespave std;

Безымянный namespace

namespace {}

появиться уникальный namespace для каждого .cpp файла. Это позвляет создавать меленькие структуры не боясь перекрытия имен.

namespace a=ru::spb::au

И тогда можно будет писать a::f();.

ADL=argument dependent look up

namespace g
{ 
  strcut complex{};
  complex operator+();
}
g::a+b   %написано что-то непонятное
а=g::operator+(a,b)
  

Поиск имен ***** там где мы находимся, а также и в namespace аргументов(это первый шаг)

Поиск Кенига.