是否有一个标准容器与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)
答案 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 dereferencing。 Check out the docs