Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП - 2 часть - Лекция 4. STL.docx
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
134.67 Кб
Скачать

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копирует диапазон значений в обратном порядке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]