Found.
Found at position 3
Else
Else
Алгоритм search
Алгоритм for__each
Этот алгоритм позволяет выполнить некоторое действие над каждым элементом диапазона [fist, last).
Чтобы определить, какое именно действие должно быть выполнено, нужно написать соответствующую функцию с одним аргументом типа Т (Т — тип данных, содержащихся в контейнере).
Функция не имеет права модифицировать данные в контейнере, но может их использовать в своей работе.
Имя этой функции передается в качестве третьего аргумента алгоритма.
Например, в следующей программе for_each используется для перевода всех значений массива из дюймов в сантиметры и вывода их на экран.
void InchToCm (double inch) {
cout << (inch * =2.54) << ' ';
}
int main(){
double inches [ ] = {0.5, 1.0, 1.5, 2.0, 2.5};
for_each(inches, inches + 5, InchToCm);
return 0;
}
Некоторые алгоритмы оперируют одновременно двумя контейнерами.
Таков и алгоритм search, находящий первое вхождение в первую последовательность [first1, last1) второй последовательности [first2, last2).
Например:
int main() {
int arr[] = {11, 77, 33, 11, 22, 33, 11, 22, 55};
int pattern[] = { 11, 22, 33 };
int* ptr = search(arr, arr + 9, pattern, pattern + 3);
if (ptr == arr + 9)
cout << "Pattern not found" << endl;
cout << "Found at position " << (ptr - arr) << endl;
list<int> lst (arr, arr + 9);
1ist<int>::iterator ifound;
ifound = search(lst.begin(), lst.end(), pattern, pattern + 3);
if (ifound == lst.end())
cout << "Pattern not found" << endl;
cout << "Found." << endl;
return 0;
}
Результат выполнения программы:
Отметим, что список не поддерживает произвольного доступа к своим элементам и соответственно не допускает операций «+» и «-» с итераторами. Поэтому мы можем только зафиксировать факт вхождения последовательности pattern в контейнер lst.
Назначение алгоритма очевидно из его названия. Алгоритм можно применять только для тех контейнеров, которые обеспечивают произвольный доступ к элементам,
— этому требованию удовлетворяют массив, вектор и двусторонняя очередь, но не удовлетворяет список.
В связи с этим класс 1ist содержит метод sort(), решающий задачу сортировки.
Алгоритм sort имеет две сигнатуры:
tempiate<class RandomAccessIt> void sort(RandomAccessIt fist, RandomAccessIt last);
tempiate<class RandomAccessIt> void sort(RandomAccessIt fist, RandomAccessIt last, Compare comp);
Первая форма алгоритма обеспечивает сортировку элементов из диапазона [first,last), причем для упорядочения по умолчанию используется операция <, которая должна быть определена для типа Т.
Т — тип данных, содержащихся в контейнере.
Таким образом, сортировка по умолчанию — это сортировка по возрастанию значений. Например:
int main() {
double arr[6] = {2.2, 0.0, 4.4, 1.1, 3.3, 1.1};
vector<double> v1(arr, arr + 6);
sort (v1.begin(), v1.end());
print(v1);
return 0;
}
Результат выполнения программы: