Контейнер RAII с целочисленным индексированием для не копируемого типа - PullRequest
4 голосов
/ 30 ноября 2011

Существует ли стандартный контейнер, имеющий тот же общий API, что и vector<T>, но который заполняет новые местоположения с помощью прямого построения по умолчанию?


Фон:

У меня есть тип, который запрещает копирование, но имеет конструктор по умолчанию, и я действительно хочу сделать следующее:

vector<NoCopy> bag(some_size);

// use bag[i]'s

return; // bag & contents get correctly cleaned up. 

Однако это не работает, потому что vector<T>(int) реализован в терминах конструирования по умолчаниюобъект, а затем скопировать его в каждое из новых мест.


Редактировать: Не C ++ 0xB (он же C ++ 11)

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

Одним из вариантов будет обновление до стандартной библиотеки C ++ 11.

В C ++ 11 конструктор vector(size_type) по умолчанию создает N элементов в контейнере.Он не копирует и не перемещает какие-либо элементы.

Visual C ++ 2010 не поддерживает эту функцию C ++ 11;Я верю, что Visual C ++ 11 Developer Preview действительно правильно поддерживает его.Я не знаю, поддерживают ли это последние версии libstdc ++;Я подозреваю, что libc ++ делает.

2 голосов
/ 30 ноября 2011

Назовите это обходным путем, но когда мне нужны контейнеры типов NoCopy, я обычно использую boost :: ptr_vector или std :: vector .

Очевидно, что это немного дороже, но, к счастью для меня, это еще не было для меня проблемой.

Хорошая вещь в boost :: ptr_vector заключается в том, что она делает автоматическую разыменование на некоторых доступах. Ознакомьтесь с документами .

2 голосов
/ 30 ноября 2011

Boost.Container , новый в Boost 1.48, имеет boost::container::vector, который предоставляет эту функцию.Это соответствует C ++ 03, с выбранными функциями C ++ 11 .

Ну, есть один C ++ 03, которому boost::container::vector не соответствует:на самом деле vector из bool с.Хотя я думаю, что большинство людей посчитали бы это выгодой .

...