Проблема с получением существующего coontainer библиотеки std и компиляцией с отключенными исключениями состоит в том, что сами интерфейсы контейнера std предполагают, что исключения включены.Используя исключения, оператор new сгенерирует, если он не сможет получить память, без исключений оператор new вместо этого возвратит 0, что не может обрабатывать контейнеры std.
Один из подходов - использовать только алгоритмы STL + вектор.Вы можете скопировать около 95% того, что делают другие контейнеры, используя это.Проблема состоит в том, что большинство реализаций STL предполагают, что
v.reserve(v.size()+1);
assert(v.size()+1<=v.capacity());
никогда не будет утверждаться (так как резерв будет выбрасывать, если нет памяти).Чтобы это никогда не возникало, я использовал контейнеры с «фиксированной емкостью», то есть контейнеры с емкостью, фиксированной во время компиляции.В основном это векторы, где я передаю специальный распределитель.Затем вы можете проверить max_size () контейнера перед вставкой.Тогда просто избегайте использования таких вещей, как at ().Для еще большей предсказуемости используйте basic_string вместо vector.Это заставляет вас хранить только те типы POD, которые никогда не генерируются при копировании или создании по умолчанию.Кроме того, требования к памяти легче вычислить.
Другой подход заключается в использовании навязчивых контейнеров.Они не генерируют (возможно, за пределами неправильного использования интерфейса), так как они никогда не получают память в первую очередь.