Дефекты STL
Хотя стандартные библиотеки C++ являются очень общими и эффективными библиотеками, некоторые незначительные детали их интерфейсов кажутся неутешительными.
Алгоритмы не могут принимать контейнеры напрямую.
std::sort(myvec.begin(), myvec.end());
вместоstd::sort(myvec);
(Я не вижу действительного, почему вторая форма не была предоставлена с самого начала)Большинство членов функции, принимающих строку, требуют
const char *
вместоconst std::string&
, (C++ строкиstd::string
по крайней мере должна быть перегрузка)
Насколько я знаю, эти два небольших дефекта должны быть исправлены в c++0x
стандарт.
Можете ли вы увидеть другие из этих мелких дефектов?
Почему вы думаете, что это дефект?
Будет ли это исправлено когда-нибудь?
(конечно, дебаты здесь не за или против общего программирования, а на самом деле об общих проблемах проектирования. Просто отсутствуют перегрузки, отсутствует версия алгоритмов, неудобный интерфейс...)
2 ответа
- Алгоритмы не могут принимать контейнеры напрямую. std::sort(myvec.begin(), myvec.end()); вместо std::sort(myvec);
Эта функция на самом деле является функцией (она позволяет зацикливаться на C-массивах), хотя, как уже сказал GMan в комментарии, ее можно улучшить.
- Большинство членов функции, принимающих строку, требуют const char * вместо const std::string&
Это совершенно неправильно, так как большинство функций STL не являются членами, большинство из них не функции, а шаблоны функций, и (почти?) Ни одна из них не имеет дело исключительно со строками.
(Вы, вероятно, говорите о файловом потоке, который является частью стандартной библиотеки, но не той части стандартной библиотеки, которая вытекает из STL. И, конечно, есть причины, по которым они были приняты const char*
, хотя это тоже можно было бы улучшить.)
Похоже, что многие из тех, кто критикует STL, недостаточно знают об этом, чтобы иметь возможность сделать это. Это не значит, что критиковать нечего. Но, как и в других областях, прежде чем идти и делать это, вы должны хотя бы знать, почему все так, как есть.
Что касается алгоритмов, таких как sort
Просто определите обертки, как вам нравится.
И если вам не нравится определять отдельные обертки, то определите макрос
#define ALL_OF( container ) startOf( container ), endOf( container )
С подходящим startOf
а также endOf
Шаблоны функций это прекрасно работает как для необработанных массивов, так и для стандартных библиотечных контейнеров.
Т.е. твоя первая проблема не проблема.
относительно const char*
аргументы, как правило, это не проблема, что они не string const&
, Однако было бы неплохо, если бы у стандартной библиотеки был стандартный строковый носитель с небольшим объемом служебной информации, и это использовалось. И это реальная проблема, что широкие символьные строки не поддерживаются, например, для конструкторов файловых потоков (код Windows должен использовать нестандартные расширения): это тот случай, когда правильная программа для среды выполнения не может быть выражена в стандартном C++ используя только стандартную библиотеку.
И то же самое, конечно, для main
, которая является проблемой, которая охватывает основной язык и библиотеку.