Что такого хорошего в STL?
STL отлично подходит для того, чтобы он был задуман очень рано и все же успешно применял парадигму обобщенного программирования C++ довольно эффективно.
Она отделена эффективно структуры данных: vector
, map
, ... и алгоритмы для работы на них copy
, transform
, ... пользуясь шаблонами, чтобы сделать это.
Это аккуратно развязанные проблемы и предоставленные общие контейнеры с крючками настройки (Comparator
и Allocator
параметров шаблона).
Результат очень элегантный (принцип DRY) и очень эффективен благодаря оптимизации компилятора, так что ручные алгоритмы для данного контейнера вряд ли будут лучше.
Это также означает, что он легко расширяется: вы можете создать свой собственный контейнер с помощью интерфейса, который вы хотите, до тех пор, пока он предоставляет STL-совместимые итераторы, вы сможете использовать с ним алгоритмы STL!
И благодаря использованию признаков вы можете применять алгоритмы на C-массиве с помощью простых указателей! Поговорите о обратной совместимости!
Однако, это может (возможно) было бы лучше ...
Что не так велика о STL?
Это действительно бесит меня, что всегда нужно использовать итераторы, я действительно стоять будучи в состоянии написать: std::foreach(myVector, [](int x) { return x+1;});
потому, что лицо это, в большинстве случаев вы хотите перебрать весь контейнер. ..
Но что еще хуже, что из-за этого:
set<int> mySet = /**/;
set<int>::const_iterator it = std::find(mySet.begin(), mySet.end(), 1005); // [1]
set<int>::const_iterator it = mySet.find(1005); // [2]
[1]
и [2]
осуществляется совершенно по-разному, что приводит к [1]
имея O (N) сложность, а [2]
имеет O (журнал п) сложность! Здесь проблема в том, что итераторы слишком абстрактны.
Я не имею в виду, что итераторы недостойны, я имею в виду, что предоставление интерфейса исключительно с точки зрения итераторов было плохим выбором.
Я предпочитаю себя идеей просмотров над контейнерами, например, проверьте, что сделано с Boost.MPL. С учетом того, что вы манипулируете своим контейнером (ленивым) слоем трансформации. Это делает для очень эффективных структур, что позволяет отфильтровать некоторые элементы, преобразование других и т.д. ...
Объединение взгляды и концепцию проверки идеи будет, я думаю, производить гораздо более удобный интерфейс для алгоритмов STL (и решить это find
, lower_bound
, upper_bound
, equal_range
выпуск).
Это также поможет избежать распространенных ошибок использования неопределенных диапазоны итераторов и неопределенного поведения, которые являются результатом этого ...
STL не является «специальным», он является частью стандарта C++. 'boost' является особенным. –
О да, STL ** очень ** особенный. Посмотрите на все другие стандартные библиотеки, и вы увидите, насколько особенным является STL. – wilhelmtell
@ Kirill: Строго говоря, STL полностью двусмысленна. C++ не имеет понятия STL, только Standard Library. STL может ссылаться на части шаблона стандартной библиотеки или на оригинальную стандартную библиотеку шаблонов, опубликованную SGI, или даже на что-то еще. – GManNickG