Как можно реализовать собственный класс строки, используя STL? - PullRequest
1 голос
/ 27 августа 2011

В C++ - The Complete Reference автор ставит перед нами задачу после того, как показывает, как он реализует собственный класс строки C ++. Отрывок из книги:

Задача: Попробуйте реализовать StrType (класс строки) с использованием STL. То есть используйте контейнер для хранения символов, которые содержат строку. Используйте итераторы для работы со строками и используйте алгоритмы для выполнения различных манипуляций со строками.

Я понимаю основную концепцию, но у меня возникли проблемы с ее реализацией. я должен сделать std::vector < char > и push_back для каждого символа или что-то подобное? Как насчет струнных манипуляций? Нужна помощь. Образец кода будет принят с благодарностью, или вы можете объяснить, как я могу это реализовать.

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Да, std::vector<char> звучит как отличная идея. Это избавит вас от проблем написания пользовательского деструктора, конструктора копирования и оператора назначения копирования. Кроме того, все функции-члены итератора (begin, end и другие) могут просто делегироваться версиям std::vector<char>.

Можете ли вы дать некоторый код о том, как выполнять строковые манипуляции? например, конкатенация?

Конечно, вот как я перегрузил бы operator+= и operator+ для типа строки:

class StrType
{
    std::vector<char> vec;

public:

    // ...

    StrType& operator+=(const StrType& rhs)
    {
        vec.insert(vec.end(), rhs.vec.begin(), rhs.vec.end());
        return *this;
    }
};

StrType operator+(StrType lhs, const StrType& rhs)
{
    lhs += rhs;
    return lhs;
}

Вероятно, есть более эффективная версия operator+, но вы можете понять это самостоятельно.

0 голосов
/ 27 августа 2011

Использование std::vector<char>, вероятно, будет лучшим контейнером для использования в этом случае (итераторы с произвольным доступом и низкие издержки делают его привлекательным выбором для строки).

В дополнение к вашему комментарию к ответу FredOverflow вы можете выполнить конкатенацию строк следующим образом:

std::vector<char> firstString;
firstString.push_back('A');
firstString.push_back('B');
std::vector<char> secondString;
secondString.push_back('X');
secondString.push_back('Y');

firstString.insert( firstString.end(), secondString.begin(), secondString.end() );

for( auto it = firstString.begin(); it != firstString.end(); ++it )
{
     std::cout << (*it);
}

В этом случае это будет распечатано: ABXY. Вы можете увидеть это здесь: http://ideone.com/OmdoU

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...