用于非可复制类型的整数可索引RAII容器

时间:2011-11-30 18:25:27

标签: c++ stl containers

是否有一个标准容器与vector<T>具有相同的通用API但是通过直接默认构造填充新位置?


背景:

我有一个不允许复制但有默认构造函数的类型,我真正想做的是:

vector<NoCopy> bag(some_size);

// use bag[i]'s

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

但是,这不起作用,因为vector<T>(int)是根据默认构造对象然后将其复制到每个新位置而实现的。


编辑:不是C ++ 0xB(a.k.a. C ++ 11)

3 个答案:

答案 0 :(得分:5)

一种选择是升级到符合C ++ 11的标准库实现。

在C ++ 11中,vector(size_type)构造函数默认构造N个元素到容器中。它既不复制也不移动任何元素。

Visual C ++ 2010不支持此C ++ 11功能;我相信Visual C ++ 11 Developer Preview确实支持它。我不知道libstdc ++的最新版本是否支持这个;我怀疑libc ++会这样做。

答案 1 :(得分:2)

Boost.Container,Boost 1.48中的新增内容,boost::container::vector提供此功能。符合C ++ 03,select C++11 features

嗯,有一个boost::container::vector不符合的C ++ 03:vector<bool>实际上是vector的{​​{1}}。虽然我想大多数人都认为这是的好处

答案 2 :(得分:2)

称之为解决方法,但是当我需要NoCopy类型的容器时,我通常使用boost :: ptr_vector或std :: vector&lt; shared_ptr&gt;。

显然,它稍贵一点,但幸运的是对我来说这对我来说还不是问题。

boost :: ptr_vector的好处在于它在某些访问中执行automatic dereferencingCheck out the docs