C++ 不可复制类型的整数索引可复制RAII容器

C++ 不可复制类型的整数索引可复制RAII容器,c++,stl,containers,C++,Stl,Containers,是否有一个标准容器具有与vector相同的通用API,但通过直接默认构造填充新位置 背景: 我有一个类型不允许复制,但有一个默认构造函数,我真正想做的是: vector<NoCopy> bag(some_size); // use bag[i]'s return; // bag & contents get correctly cleaned up. 矢量包(一些尺寸); //用袋子[我]的 返回;//正确清理袋子和物品。 但是,这不起作用,因为vector(in

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


背景:

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

vector<NoCopy> bag(some_size);

// use bag[i]'s

return; // bag & contents get correctly cleaned up. 
矢量包(一些尺寸);
//用袋子[我]的
返回;//正确清理袋子和物品。
但是,这不起作用,因为
vector(int)
是按照默认构造对象然后将其复制到每个新位置的方式实现的



编辑:不是C++0xB(又称C++11)

一个选项是升级到符合C++11的标准库实现

在C++11中,
向量(size\u type)
构造函数默认将N个元素构造到容器中。它既不复制也不移动任何元素

Visual C++ 2010不支持C++ 11的功能;我相信VisualC++ 11开发者预览确实支持它。我不知道libstdc++的最新版本是否支持这一点;我怀疑libc++会这样做。

是boost1.48中的新功能,它有一个提供此功能的
Boost::container::vector
。它是符合C++03标准的,带有


好的,有一个C++03与
boost::container::vector
不符:
vector
实际上是
bool
s的
vector
。虽然我想大多数人都会把这看作是一种好处。

称之为一种解决方法,但当我需要NoCopy类型的容器时,我通常使用boost::ptr\u vector或std::vector

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


boost::ptr_vector的优点在于它在某些访问中确实有效

没有
std::vector(size\u type)
构造函数。有一个
std::vector(size\u type n,const T&value=T(),const Allocator&=Allocator())
构造函数,它接受一个值。它可以是默认构造的对象,也可以是您提供的对象。无论哪种方式,它都会从这个值复制
n
次。@Nicolas:在C++98中,是的。在C++11中,有一个新的构造函数,
vector(size\u type)
,它默认直接将元素构造到容器中。在构造过程中,不允许实现复制或移动任何元素。
std::array
()如何?@NikolaiNFetissov:不过他没有要求C++11。他也没有特别要求C++98。解决方法是肯定的。最难看的是,我必须进去填充这个东西(@BCS-是的,你是对的。将不可复制类型预填充到这样的容器中可能会很烦人。