Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

 cout << lexicographical_compare(s2.begin, s2.end,

s1.begin, s1.end) << endl;

 cout << lexicographical_compare(s1.begin, s1.end,

s3.begin, s3.end) << endl;

 cout << lexicographical_compare(s3.begin, s3.end,

s1.begin, s1.end) << endl;

 pair<string::iterator, string::iterator> iters =

mismatch(s1.begin, s1.end, s2.begin);

 cout << "first mismatch = " << *(iters.first) << endl;

 cout << "second mismatch = " << *(iters.second) << endl;

}

Вывод

примера 7.4 выглядит так.

Два диапазона НЕ равны!

false

true

false

false

true

first mismatch = e

second mismatch = f

Обсуждение

Для сравнения двух последовательностей на равенство используйте

equal
. Он принимает три или четыре аргумента, в зависимости от используемой версии. Вот как объявлен
equal
.

bool equal(In1 first1, In1 last1, In2 first2);

bool equal(In1 first1, In1 last1, In2 first2, BinPred pred);

equal
с помощью
operator==
сравнивает каждый элемент между
first1
и
last1
с элементами, начиная с
first2
. Если указать
pred
, то
equal
для проверки будет использовать его. Перед вызовом
equal
убедитесь, что каждая последовательность имеет одинаковую длину. Он предполагает, что второй диапазон не меньше первого, и если это не так, то его поведение не определено.

Если требуется узнать, где и как последовательности отличаются, используйте

lexicographical_compare
или
mismatch
.
lexicographical_compare
сравнивает две последовательности и возвращает истину, если первая лексикографически меньше второй, что означает, что каждая пара элементов в двух последовательностях сравнивается с помощью оператора
<
. Объявление
lexicographical_compare
выглядит вот так.

bool lexicographical_compare(In1 first1, In1 last1,

 In2 first2, In2 last2);

bool lexicographical_compare(In1 first1, In1 last1,

 In2 first2, In2 last2, Compare comp);

Если

operator<
возвращает истину или первая последовательность заканчивается раньше второй, то возвращается истина. В противном случае возвращается ложь. Рассмотрим последовательность символов из примера 7.4.

string s1 = "abcde";

string s2 = "abcdf";

string s3 = "abc";

lexicographical_compare(s1.begin, s1.end, // abcde < abcde

 s1.begin, s1.end); // = false

lexicographical_compare(s1.begin, s1.end, // abcde < abcdf

 s2.begin(s2.end); // = true

lexicographical_compare(s2.begin, s2.end, // abcdf < abcde

 s1.begin, s1.end); // = false

lexicographical_compare(s1.begin, s1.end, // abcde < abc

 s3.begin(s3.end); // = false

lexicographical_compare(s3.begin, s3.end, // abc < abcde

 s1.begin, s1.end); // = true

Сложность

lexicographical_compare
линейна и выполняет число сравнений, равное длине меньшей из двух последовательностей, или до тех пор, пока один из элементов в одной из последовательностей не окажется меньше соответствующего элемента другой. Сравнения реализованы полностью на основе
operator<
, так что если
iter1
и
iter2
— это итераторы двух последовательностей, то сравнение останавливается тогда, когда
*iter1 < *iter2
или
*iter2 < *iter1
.

mismatch
говорит, где две последовательности различаются. Однако его объявление несколько отличается от
equal
и
lexicographical_compare
, так как он возвращает не
bool
, a
pair<>
итераторов. Вот оно.

pair<In1, In2> mismatch(In1 first1, In1 last1, In2 first2);

pair<In1, In2> mismatch(In1 first1, In1 last1, In2 first2, BinPred);

Два возвращаемых итератора указывают на различные элементы каждой из последовательностей. Рассмотрим пример 7.4.

string s1 = "abcde";

string s2 = "abcdf";

pair<string::iterator, string::iterator> iters =

 mismatch(s1.begin, s1.end, s2.begin);

cout << "first mismatch = " << *(iters.first) << '\n'; // 'e'

cout << "second mismatch = " << *(iters.second) << '\n'; // 'f'

Вы должны убедиться, что длина второго диапазона не меньше первого. Если вторая последовательность короче первой,

mismatch
не сможет узнать этого и продолжит выполнение сравнения элементов за границей второй последовательности, что приведет к непредсказуемому поведению. Кроме того, если несовпадений нет, то первый итератор будет указывать на
last1
, который может оказаться недействительным (например, если в качестве
last1
передать
end
.

Вы, должно быть, заметили по объявлениям каждой из этих функций, что типы итераторов для каждой из этих последовательностей различны. Это означает, что две последовательности могут быть контейнерами разных типов, но при условии, что типы элементов, на которые указывают итераторы, имеют определенный для них

operator<
. Например, можно сравнивать
string
и
vector<char>
.

string s = "Coke";

vector<char> v;

Поделиться:
Популярные книги

Идеальный мир для Лекаря 30

Сапфир Олег
30. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 30

Плеяда

Суконкин Алексей
Проза:
военная проза
русская классическая проза
5.00
рейтинг книги
Плеяда

Непристойное предложение. Книга 2

Кроу Лана
2. Предложение
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Непристойное предложение. Книга 2

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Ваше Сиятельство 5

Моури Эрли
5. Ваше Сиятельство
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Ваше Сиятельство 5

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Жандарм 2

Семин Никита
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 2

Антимаг его величества. Том II

Петров Максим Николаевич
2. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том II

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15