Назад | Начало урока | Вперед
Содержание

Глава 3

Вверх

Функция compare() класса string позволяет выполнять гораздо более изощренные и точные сравнения, чем набор внешних операторов. Она существует в нескольких перегруженных версиях для сравнения:

  • двух полных строк
  • части одной строки с полной строкой
  • подмножеств двух строк

    В следующем примере сравниваются две полные строки.


    //: C03:Compare.cpp
    // Применение функций compare() и swap()
    #include <cassert>
    #include <string>
    using namespace std;

    int main() {

    string first("This");
    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);
    } ///:~


    Результат:

    Анализ:

    Функция swap(), использованная в примере меняет местами содержимое своего объекта и аргумента.

    Вверх

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

    Например можно воспользоваться следующей перегруженной версией compare():


    //: C03:Compare2.cpp
    // Использование перегруженной версии compare()
    #include <cassert>
    #include <string>
    using namespace std;

    int main() {

    string first("This is a day that will live in infamy");
    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);
    } ///:~


    Результат:

    Анализ:

    Вверх

    Во всех примерах, встречавшихся ранее, при обращении к отдельным символам строк использовался синтаксис индексирования ([]) в стиле массивов С. Строки С++ так же поддреживают альтернативный вариант: функцию at(). Если все проходит нормально, эти два механизма индексации приводят к одинаковым результатам:


    //: C03:StringIndexing.cpp
    #include <cassert>
    #include <string>
    using namespace std;

    int main(){

    string s("1234");
    assert(s[1] == '2');
    assert(s.at(1) == '2');
    } ///:~


    Результат:

    Анализ:

    И все же между оператором [] и функций at() существует одно важное различие. При попытке обратиться к элементу по индексу, выходящему за границы массива, функция at() великодушно выдает исключение, тогда как обычный синтаксис [] приводит к непредсказуемым последствиям:


    //: C03:BadStringIndexing.cpp
    #include <exception>
    #include <iostream>
    #include <string>
    using namespace std;

    int main(){

    string s("1234");
    // Функция at() запускает исключение и спасает вас от беды:
    try {
    s.at(5);
    }
    catch(exception& e) {
    cerr << e.what() << endl;
    }
    } ///:~


    Результат:

    Анализ:

    Добросовестные программисты не пишут неправильные индексы, но если вы захотите воспользоваться преимуществами автоматической проверки индексов, используйте функцию at() вместо оператора [], это позволит корректно продолжить работу после ссылок на несуществующие элементы.

    При запуске этой программы на одном из тестовых компиляторов был получен следующий результат:

    invalid string position

    Функция at() запускает объект класса out_of_range, производный ( в конечном счете) от std::exception. Перехватывая этот объект в обработчике, можно предпринять необходимые меры, например вычислить заново неправльный индекс или расширить массив.

    Индексация с применением операторной функции string::operator[]() не обепечивает такой защиты и является таким же рискованным делом, как обработка символных массивов в С.

    По соображениям безопасности комитет по стандартизации С++ рассматривает предложение, согласно которому функция string::operator[]() переопределяется идентично string::at().


    Назад | Начало урока | Вверх | Вперед
    Содержание

    Hosted by uCoz