- •2 Часть
- •Источники информации
- •1.2 Введение вStl
- •1.2.1 Обзор библиотеки
- •1.2.2 Базовые понятия
- •2 Контейнеры
- •2.1 Простые контейнеры
- •2.1.1 Пара (Pair/Tuple)
- •2.2 Контейнеры с последовательным доступом
- •2.2.1 Вектор (vector)
- •2.2.2 Список (list)
- •2.2.3Forward_list
- •2.2.4 Очередь двухсторонняя (deque)
- •2.3 Контейнеры-адаптеры
- •2.3.1 Очередь односторонняя (queue)
- •2.3.2 Очередь с приоритетами (priority queue)
- •2.3.3 Стек (stack)
- •2.4 Контейнеры с доступом к случайным элементам
- •2.4.1 Упорядоченное множество элементов (set)
- •2.4.2Multiset
- •2.4.3 Словарь (map)
- •2.4.4Multimap
- •3 Итераторы
- •4 Алгоритмы
- •4.1 Не модифицируют коллекцию
- •4.1.1 All_of / any_of / none_of
- •4.1.2For_each
- •4.1.3 Find / find_if / find_if_not / find_end / find_first_of
- •4.1.4Count/count_if
- •4.2.2Move/move_backward
- •4.4.2Partial_sort/partial_sort_copy
- •6 БудущееStl
- •7 Наследование и работа с памятью вStl
4.1.2For_each
Выполняет заданный функтор для всех элементов.
Идея за функтором в виде структуры, у которой перекрыт оператор скобки (обратите внимание как), такая: иногда хочется настроить поведение функтора перед тем как его использовать (например, добавить конструктор с параметрами, меняющими его работу).
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
void printIt(int i)
{
std::cout << ' ' << i;
}
struct Print
{
string Delimiter;
Print(const string& delimiter)
{
Delimiter = delimiter;
}
void operator() (int i) { std::cout << Delimiter << i; }
};
int _tmain()
{
vector<int> data = {1, 2};
for_each(data.begin(), data.end(), printIt); // via procedure
for_each(data.begin(), data.end(), Print(" ")); // via functor
for_each(data.begin(), data.end(), [](int x) { cout << x << " "; }); // via anonymous functor
getchar();
return 0;
}
Обратите внимание, for_eachожидает особую сигнатуру функтора/подпрограммы:intxилиint&xилиconstint&x. Если мы зададим другую сигнатуру в функторе, то оно не скомпилится.
4.1.3 Find / find_if / find_if_not / find_end / find_first_of
Findищет итератор на заданный элемент в коллекции.
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int _tmain()
{
vector<int> data = {1, 2};
auto foundElementIterator = find(data.begin(), data.end(), 1);
if (foundElementIterator != data.end())
{
cout << "Found element 1!\n";
}
getchar();
return 0;
}
Find_ifищет элемент, удовлетворяющий какому-то условию.
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int _tmain()
{
vector<int> data = {1, 2};
auto foundElementIterator = find_if(data.begin(), data.end(), [](int i) {return i % 2; });
if (foundElementIterator != data.end())
{
cout << "Found element ! " << *foundElementIterator << "\n";
}
getchar();
return 0;
}
find_end ищет с конца.
find_first_ofищет итератор, откуда одно множество элементов есть в другом множестве элементов.
4.1.4Count/count_if
Считает, сколько раз заданный элемент встречается в коллекции. Вторая вариация считает сколько элементов удовлетворяют заданному функтору.
4.1.5mismatch
Ищет с какого итератора 2 коллекции начинают различаться.
4.1.6equal/is_permutation
Equalпроверяет, что коллекции идентичны по значениям и по их расположению.
Is_permutationпроверяет, кто коллекция идентична по значениям.
4.1.7search/search_n
Searchищет итератор первого вхождения одной коллекции в другую коллекцию.
Search_nтребует помимо этого, чтобы было определенное количество повторов элементов.
4.2 Модифицируют коллекцию
4.2.1copy/copy_n/copy_if/copy_backward
Copyкопирует набор элементов из одной коллекции в другую коллекцию.
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int _tmain()
{
vector<int> data = {1, 2};
vector<int> destination;
copy(data.begin(), data.end(), destination.begin());
getchar();
return 0;
}
Copy_nкопирует заданное количество элементов начиная с какого-то в указанное место.
Copy_ifкопирует элементы из диапазона, которые удовлетворяют какому-либо функтору.
Copy_backwardкопирует диапазон значений в обратном порядке.