Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab6-algorithms / lab6-algorithms.doc
Скачиваний:
8
Добавлен:
10.04.2015
Размер:
203.26 Кб
Скачать

Отличие (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;

}

Соседние файлы в папке lab6-algorithms