#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
Комментариев нет:
Отправить комментарий