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;
}
Вывод
Два диапазона НЕ равны!
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
рейтинг книги
Плеяда
Проза:
военная проза
русская классическая проза
5.00
рейтинг книги
Непристойное предложение. Книга 2
2. Предложение
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Жена по ошибке
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Невеста напрокат
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Возвышение Меркурия. Книга 16
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 5
5. Ваше Сиятельство
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Последний Паладин. Том 2
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жандарм 2
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Антимаг его величества. Том II
2. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Лолита
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Идеальный мир для Лекаря 15
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00