Глава 3
Вверх
Функция compare() класса string позволяет выполнять гораздо более изощренные и точные сравнения, чем набор внешних операторов. Она существует в нескольких перегруженных версиях для сравнения:
В следующем примере сравниваются две полные строки.
int main() {
Анализ:
Функция swap(), использованная в примере меняет местами содержимое своего объекта и аргумента.
Вверх
Чтобы сравнить подмножества символов в одной или обеих строках, добавьте аргументы, определяющие начальную позицию и количество сравниваемых символов.
Например можно воспользоваться следующей перегруженной версией compare():
int main() {
Анализ:
Вверх
Во всех примерах, встречавшихся ранее, при обращении к отдельным символам строк использовался синтаксис индексирования ([]) в стиле массивов С. Строки С++ так же поддреживают альтернативный вариант: функцию at(). Если все проходит нормально, эти два механизма индексации приводят к одинаковым результатам:
int main(){
Анализ:
И все же между оператором [] и функций at() существует одно важное различие. При попытке обратиться к элементу по индексу, выходящему за границы массива, функция at() великодушно выдает исключение, тогда как обычный синтаксис [] приводит к непредсказуемым последствиям:
int main(){
Анализ:
Добросовестные программисты не пишут неправильные индексы, но если вы захотите воспользоваться преимуществами автоматической проверки индексов, используйте функцию at() вместо оператора [], это позволит корректно продолжить работу после ссылок на несуществующие элементы.
При запуске этой программы на одном из тестовых компиляторов был получен следующий результат:
invalid string position
Функция at() запускает объект класса out_of_range, производный ( в конечном счете) от std::exception. Перехватывая этот объект в обработчике, можно предпринять необходимые меры, например вычислить заново неправльный индекс или расширить массив.
Индексация с применением операторной функции string::operator[]() не обепечивает такой защиты и является таким же рискованным делом, как обработка символных массивов в С.
По соображениям безопасности комитет по стандартизации С++ рассматривает предложение, согласно которому функция string::operator[]() переопределяется идентично string::at().
Назад |
Начало урока |
Вверх |
Вперед
//: C03:Compare.cpp
// Применение функций compare() и swap()
#include <cassert>
#include <string>
using namespace std;
string second("That");
assert(first.compare(first) == 0);
assert(second.compare(second) == 0);
// Какая из строк лексически больше?
assert(first.compare(second) > 0);
assert(second.compare(first) < 0);
first.swap(second);
assert(first.compare(second) < 0);
assert(second.compare(first) > 0);
Результат:
//: C03:Compare2.cpp
// Использование перегруженной версии compare()
#include <cassert>
#include <string>
using namespace std;
string second("I don't believe that this is what "
"I signed up for");
// Сравнение "his is" в обеих строках:
assert(first.compare(1, 7, second, 22, 7) == 0);
// Сравнение "his is a" с "his is w":
assert(first.compare(1, 9, second, 22, 9) < 0);
Результат:
//: C03:StringIndexing.cpp
#include <cassert>
#include <string>
using namespace std;
assert(s[1] == '2');
assert(s.at(1) == '2');
Результат:
//: C03:BadStringIndexing.cpp
#include <exception>
#include <iostream>
#include <string>
using namespace std;
// Функция at() запускает исключение и спасает вас от беды:
try {
catch(exception& e) {
Результат:
Содержание