Подтвердить что ты не робот

В чем разница между boost:: container:: vector и std::vector

В чем разница между boost:: container:: vector и std::vector?

4b9b3361

Ответ 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).