У меня есть вектор std::vector<std::vector<ContactPairs>> m_contactPairs;
Если я вызову m_contactPairs.push_back()
или любую другую функцию, которая изменит размер самого внешнего вектора, должны ли элементы внутри этого вектора перераспределиться (внутренние элементы в этом случае будут std::vector<ContactPairs>
) или внутренние векторы просто сделают неглубокую копию и продолжат указывать на такая же память у них уже есть?
Я использую Visual Studio 2010, более раннюю версию C++11, но имеющую некоторые функции в виде расширений.
noexcept
, и соответствующая реализация может выполнять глубокую копию или перемещение в зависимости от того, помечены ли дополнительные операции в векторахnoexcept
. Кроме того, стратегия роста и количество внутренних копий вектора не стандартизированы, поэтому количество копий не является существенным атрибутом контейнера. Существуют реализации стандартных библиотек C++03, которые будут перемещать буферы без запуска глубоких копий (Dinkumware, BSL). 27.01.2015noexcept
не было связано с согласованностью, хотя большинство людей его не используют, в типеAllocator
, передаваемом в контейнер, есть точка расширения. Шаблонstd::vector
в общем случае не может гарантировать, что распределитель может быть перемещен в место назначения без создания исключения. Распределители - это весело, большинству людей все равно, и все же они должны платить цену;) 27.01.2015push_back
обеспечивает строгую гарантию исключения, только если содержащийся объект не генерирует исключение при копировании/перемещении. Все еще изучаю C++03. 27.01.2015push_back
как эквивалентa.insert(a.end(),x)
и говорит, что если исключение выдается не конструктором копирования или оператором присваивания T, никаких эффектов не будет, аналогично C++ 11, но поскольку vector не может перемещать конструкцию, которая ничего не получает, так что вы правы насчет C++03. 27.01.2015push_back()
не может гарантировать никаких эффектов в случае, если типT
не обеспечивает надлежащую реализацию конструктора копирования или оператора присваивания, потому что он никак не может этого сделать. Эти операции могут касаться глобального состояния, которое имеет видимые побочные эффекты. 27.01.2015