Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

История C++. Разноименные методы с одинаковым функционалом

#cpp #stl #история


Вот мне стало интересно после долгой работы с контейнерными классами STL Library
C++, зачем в многие из них были добавлены разноименные методы с одинаковым функционалом?
Так, например, если рассмотреть класс string, то:

std::string::size() === std::string::length();


Методы разноименны, но функционал один и тот же. Вопрос - зачем? Это как-то связано
с историей C, или одной группе разработчиков STL тупо не понравился метод size() и
они решили добавить свой length() ? Также можно привести пример всех ассоциативных
классов STL:

std::vector::at()  === std::vector::operator [];


Зачем это? Они отличаются скоростью работы? Или, может, все-таки специфичной начинкой?
    


Ответы

Ответ 1



Начну с простого. Методы at() и operator[] - совсем не одно и то же. at() предоставляет безопасный доступ к элементам коллекции. Если происходит выход за пределы коллекции, метод at() выбрасывает исключение, а operator[] - нет. Однако, за безопасность приходится платить более медленной работой at().

Ответ 2



Вообще-то можно было заглянуть в первоисточник, а именно исходный код библиотеки STL и убедиться самому, что ф-ции size() и length() возвращают одно и то же. Сделано так потому что ф-ции size() х-ны для всех контейнеров STL, но для строк логичнее брать не размер, а длину (length). public: // Size, capacity, etc. size_type size() const { return _M_finish - _M_start; } size_type length() const { return size(); } UPD: касательно wstring хочу обратить внимание на один момент. Размер строки и длина строки (в символах) может отличаться. Но при этом size и length возвращают одно и то же. Этому посвящен этот вопрос на SO

Комментариев нет:

Отправить комментарий