В чем разница между boost:: container:: vector и std::vector
В чем разница между boost:: container:: vector и std::vector?
Ответы
Ответ 1
Случай, когда вам может потребоваться ускоренная версия вместо стандартной версии, когда вы сталкиваетесь с специализацией <bool>
.
std::vector<bool>
реализуется как битовый набор, он не сохраняет свой элемент в виде массива bool
.
Это означает, например, что следующий код не будет работать:
template<T>
void handleElement(T &element);
// suppose we get a bool vector:
std::vector<bool> v = ....;
// then this fails because v[i] is a proxy object
handleElement(v[0]);
boost::container::vector<bool>
не имеет такой специализации.
Ответ 2
Есть несколько отличий, которые я мог бы скомпилировать:
° Нет специализации boost::container::vector<bool>
(source @roeland)
decltype(std::vector<bool>(10)[0]) == std::_Bit_reference
decltype(boost::container::vector<bool>(10)[0]) == bool&
° Использует инфраструктуру распределения распределителей, которая (особенно в С++ 1x) более гибкая, чем стандартный распределитель, не игнорирует определенные черты, которые предоставляются распределителем. (источник: http://www.boost.org/doc/libs/1_59_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.containers_explained.stl_container_requirements)
std::vector<double>::allocator_type == std::allocator<double>
boost::container::vector<double>::alloctor_type == boost::container::new_allocator<double>
В частности, все же можно указать типы reference
и pointer
, отличающиеся от T&
и T*
(см. Возможно ли еще настроить вектор STL "ссылочный" тип?)
° Поддержка рекурсивных контейнеров (источник: библиотеки Boost С++ от Boris Schäling).
Некоторые (старые?) реализации STL не поддерживали неполные типы значений (в первую очередь они не требовались), в частности рекурсивные контейнеры.
using boost::container::vector;
struct animal{
vector<animal> children; // may not work with std::vector
};
int main(){
animal parent;
animal child1;
animal child2;
parent.children.push_back(child1);
parent.children.push_back(child2);
}
° std::vector
является спецификацией, а не реализацией.
Для всех платформ существует только одна реализация boost::container::vector
, поэтому можно сделать больше допущений (например, изначально std::vector
не требовалось использовать непрерывную память) (источник: библиотеки Boost С++ от Boris Schäling).