- •Алгоритмы немодифицирующие последовательность Операции с каждым элементом (For each)
- •Поиск (Find)
- •Найти повторение (Аdjacent find)
- •Подсчет (Count)
- •Сравнение на равенство (Equal)
- •Отличие (Mismatch)
- •Поиск подпоследовательности (Search)
- •Алгоритмы модифицирующие последовательность Копировать (Copy)
- •Обменять (Swap)
- •Преобразовать (Transform)
- •Заменить (Replace)
- •Заполнить (Fill)
- •Породить (Generate)
- •Удалить (Remove)
- •Разделить (Partitions)
- •Убрать повторы (Unique)
- •Расположить в обратном порядке (Reverse)
Найти повторение (Аdjacent find)
template <class ForwardIterator>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIteratorlast);
template<classForwardIterator, class BinaryPredicate>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last,
BinaryPredicatebinary_pred);
adjacent_findнаходит пару одинаковых соседних элементов и возвращает итератор, указывающий на первый из них. Или другим словамиadjacent_findвозвращает первый итераторiтакой, чтоiиi+1находятся в диапазоне[first, last)и для которого соблюдаются следующие соответствующие условия:*i == *(i + 1),binary_pred(*i, *(i + 1)) == true. Если такой итераторiне найден, возвращаетсяlast.
Пример:
// найдем пару совпадающих букв в строке
string str("Word letter contains two \"t\" letters");
string::iterator iter = adjacent_find(str.begin(),str.end());
int dist = distance(str.begin(),iter); // dist == 7
Подсчет (Count)
template <class InputIterator, class T, class Size>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& value);
template <class InputIterator, class Predicate, class Size>
typename iterator_traits<InputIterator>::difference_type
count_if(InputIterator first, InputIterator last, Predicate pred);
count подсчитывает и возвращает количество элементов равных valueили удовлетворяющих предикату pred().
Пример подсчета гласных букв в строке:
#include <algorithm>
#include <string>
#include <iostream>
#include <iterator>
using namespace std;
bool vowel_character(char c)
{
switch(c)
{
case 'a':
case 'e':
case 'i':
case 'o':
сase 'u':
case 'y':
return true;
}
return false;
}
int main()
{
string str("Word letter contains two \"t\" letters");
int cnt = count_if(str.begin(),str.end(),vowel_character);
cout << "String \"" << str << "\" contains " << cnt
<< " vowel letters" << endl;
return 0;
}
Сравнение на равенство (Equal)
template <class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2);
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate binary_pred);
equalпроверяет две последовательности и возвращает true в случае если элементы в этих последовательностях попарно равны, т.е. первый элемент первой последовательности равен первому элементу второй последовательности, а также второй элемент первой последовательности равен второму элементу второй последовательности, а также третий элемент первой последовательности равен третьему элементу второй последовательности и т.п. Cравнение осуществляется с помощью operator== или предиката binary_pred. Важно отметить, что первая последовательность задана, как обычно парой итераторов [first1; last1), а вторая только начальным итератором first2, алгоритм предполагает, что вторая последовательность содержит по крайне мере столько же элементов сколько и первая. Если вторая последовательность окажется короче первой, то поведение программы будет неопределенно.
Более интересна вторая версия алгоритма, которая позволяет пользователю самому задать критерий равенства или неравенства элементов последовательностей, при этом элементы последовательности не должны иметь один и тот же тип. Так например первая последовательность может содержать строки, а вторая целые числа, если числа совпадаю с длинами строк, то эти последовательности будут равны.
#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool bin_predicate(const string& str, int i)
{
return str.length() == i;
}
int main()
{
vector<int> VectorOfInt;
vector<string> VectorOfString;
VectorOfString.push_back("Str");
VectorOfString.push_back("String");
VectorOfString.push_back("Long string");
VectorOfString.push_back("Very-very-very-long string");
VectorOfInt.push_back(3);
VectorOfInt.push_back(6);
VectorOfInt.push_back(11);
VectorOfInt.push_back(26);
if (equal(VectorOfString.begin(),
VectorOfString.end(),
VectorOfInt.begin(),
bin_predicate))
{
cout << "Two sequences are equal" << endl;
}
else
{
cout << "Two sequences are different" << endl;
}
return 0;
}
Поскольку длины строк содержащихся в одном векторе совпадают с числами из другого сообщения, будет выведено сообщение о том, что последовательности равны.
