Реализация std::vector
, поставляемая с Visual Studio 2010 и более ранними версиями, имеет хорошо известную особенность: метод resize
имеет следующую сигнатуру (совместимую с C++03):
void resize(size_type new_size, value_type value);
вместо подписи, совместимой с C++11, которая использовалась в большинстве других реализаций STL (например, STL или STLport gcc) задолго до C++11:
void resize(size_type new_size, const value_type& value);
Проблема с первым вариантом заключается в том, что в некоторых ситуациях он не сможет скомпилироваться, если value_type
имеет спецификацию выравнивания:
struct __declspec(align(64)) S { ... };
std::vector<S> v; // error C2719: '_Val': formal parameter with __declspec(align('64')) won't be aligned
Это хорошо известная проблема без удовлетворительного решения, кроме использования другой реализации std::vector
.
Я ищу хорошо написанную, хорошо протестированную, автономную и совместимую с STL реализацию std::vector
с лицензией MIT, которую я мог бы добавить в свой проект в качестве предпочтительного контейнера для выровненные типы.
Я думал извлечь его из STLport или gcc STL, но, будучи полностью совместимыми со стандартами, они оба большие и имеют множество нетривиальных зависимостей.
(Я был бы совершенно доволен реализацией разумного подмножества std::vector
, которое поддерживало бы только push_back
, clear
, capacity
, size
, reserve
, resize
, swap
и индексацию массива.)
Любые идеи?
.resize()
приводит к сбою объявленияstd::vector<S> v;
. При создании экземпляра шаблона класса не создаются экземпляры его методов, а только используемые. (То есть ctor и dtor по умолчанию в этом случае). - person MSalters   schedule 23.02.2012