- •Алгоритмы немодифицирующие последовательность Операции с каждым элементом (For each)
- •Поиск (Find)
- •Найти повторение (Аdjacent find)
- •Подсчет (Count)
- •Сравнение на равенство (Equal)
- •Отличие (Mismatch)
- •Поиск подпоследовательности (Search)
- •Алгоритмы модифицирующие последовательность Копировать (Copy)
- •Обменять (Swap)
- •Преобразовать (Transform)
- •Заменить (Replace)
- •Заполнить (Fill)
- •Породить (Generate)
- •Удалить (Remove)
- •Разделить (Partitions)
- •Убрать повторы (Unique)
- •Расположить в обратном порядке (Reverse)
Отличие (Mismatch)
template <class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
InputIterator1 last1, InputIterator2 first2);
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
InputIterator1 last1, InputIterator2 first2,
BinaryPredicate binary_pred);
mismatchпротивоположнаequal, функция возвращает пару итераторов, указывающих на различающуюся пару элементов в последовательностях. Первый итератор пары указывает на элемент первой последовательности, второй и итератор на элемент второй. Если последовательности равный, то возвращается пары итераторов last1 и first2 + (last1 - first1).
Модифицируем предыдущий пример:
#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(11111111);
VectorOfInt.push_back(26);
pair<vector<string>::iterator, vector<int>::iterator> pr;
pr = mismatch(VectorOfString.begin(), VectorOfString.end(),
VectorOfInt.begin(), bin_predicate);
if (pr.first == VectorOfString.end())
{
cout << "Two sequences are equal" << endl;
}
else
{
cout << "Different elemetns are:" << endl;
cout << *pr.first << endl;
cout << *pr.second << endl;
}
return 0;
}
Программа выводит первую различную (с точки заданного критерия) пару элементов в двух последовательностях.
Поиск подпоследовательности (Search)
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2);
template <class ForwardIterator1, class ForwardIterator2,
class BinaryPredicate>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate binary_pred);
searchпроизводит поиск первого вхождения последовательности [first2; last2) в качестве подпоследовательности в последовательности [first1; last1). Если вторая последовательность не является подпоследовательностью первой функция возвращает last1.
Стоит отметить, что как и в случае с алгоритмами equal и mismatch последовательности не обязаны содержать элемента одного и того же типа, единственным условием применения является возможность сравнивать элементы двух последовательностей с помощью operator== или двоичного предиката binary_pred. В следующем примере производится поиск подпоследовательности, при этом элемента первой последовательности являются строками, а второй целыми числами. Элемент первой последовательности равен элементу второй, если он содержит строчное представление элемента из второй строки:
#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>
using namespace std;
bool bin_predicate(const string& str, int i)
{
return atoi(str.c_str()) == i;
}
int main()
{
vector<int> VectorOfInt;
vector<string> VectorOfString;
VectorOfString.push_back("1");
VectorOfString.push_back("22");
VectorOfString.push_back("333");
VectorOfString.push_back("4444");
VectorOfString.push_back("55555");
VectorOfString.push_back("6666");
VectorOfString.push_back("444");
VectorOfString.push_back("33");
VectorOfString.push_back("2");
VectorOfInt.push_back(4444);
VectorOfInt.push_back(55555);
vector<string>::iterator iter;
iter = search(VectorOfString.begin(),VectorOfString.end(),
VectorOfInt.begin(),VectorOfInt.end(),
bin_predicate);
if (iter == VectorOfString.end())
{
cout << "Search failed" << endl;
}
else
{
cout << "Subsequence started from element " << *iter << endl;
}
return 0;
}