Программирование. Принципы и практика использования C++ Исправленное издание, стр. 300
// из потока istream_iterator<string> eos; // сигнальная метка для ввода ostream_iterator<string> oo(os," "); // создаем итератор // вывода в поток set<string> b(ii,eos); // b — вектор, который инициализируется // данными из потока ввода copy(b.begin(),b.end(),oo); // копируем буфер в поток вывода}
setset21.7.4. Алгоритм copy_if()
Алгоритм
copy()unique_copy()template<class In,class Out,class Pred>Out copy_if(In first,In last,Out res,Pred p) // копирует элементы, удовлетворяющие предикату{ while (first!=last) { if (p(*first)) *res++ = *first; ++first; } return res;}Используя наш объект-функцию
Larger_thanvoid f(const vector<int>& v) // копируем все элементы, которые больше шести{ vector<int> v2(v.size()); copy_if(v.begin(),v.end(),v2.begin(),Larger_than(6)); // ...}
copy_if21.8. Сортировка и поиск
mapsetsort()sort()<template<class Ran> void sort(Ran first, Ran last);template<class Ran,class Cmp> void sort(Ran first,Ran last,Cmp cmp);В качестве примера сортировки, основанной на критерии, определенном пользователем, покажем, как упорядочить строки без учета регистра.
struct No_case { // lowercase(x) < lowercase(y) bool operator()(const string& x, const string& y) const { for (int i = 0; i<x.length(); ++i) { if (i == y.length()) return false; // y<x char xx = tolower(x[i]); char yy = tolower(y[i]); if (xx<yy) return true; // x<y if (yy<xx) return false; // y<x } if (x.length()==y.length()) return false; // x==y return true; // x<y (в строке x меньше символов) }};void sort_and_print(vector<string>& vc){ sort(vc.begin(),vc.end(),No_case()); for (vector<string>::const_iterator p = vc.begin(); p!=vc.end(); ++p) cout << *p << '\n';}
find()Предположим, что мы ищем значение x; посмотрим на средний элемент.
• Если значение этого элемента равно
x• Если значение этого элемента меньше
xх• Если значение этого элемента больше
xх• Если мы достигли последнего элемента (перемещаясь влево или вправо) и не нашли значение
x