是否有一个C++容器具有合理的随机访问权限,从不调用元素类型的复制构造函数?

BCS*_*BCS 4 c++ stl

我需要一个实现以下API的容器(不需要实现其他任何东西):

class C<T> {
  C();

  T& operator[](int); // must have reasonably sane time constant

    // expand the container by default constructing elements in place.
  void resize(int); // only way anything is added.
  void clear();

  C<T>::iterator begin();
  C<T>::iterator end();
}
Run Code Online (Sandbox Code Playgroud)

并可用于:

class I {
 public:
  I();
 private:  // copy and assignment explicate disallowed
  I(I&);
  I& operator=(I&);
}
Run Code Online (Sandbox Code Playgroud)

剂量这样的野兽存在吗?

vector<T>不这样做(调整大小的动作),我不确定它有多快deque<T>.


我不关心分配

有几个人认为我无法复制的原因是内存分配问题.约束的原因是元素类型明确禁止复制,我不能改变它.


看起来我得到了答案:STL没有.但现在我想知道为什么不呢?

sth*_*sth 5

您可以使用指针容器,例如std::vector<T*>,如果无法复制元素并在其他位置手动管理其内存.

如果向量应该拥有元素,那么类似的东西std::vector< std::shared_ptr<T> >可能更合适.

还有Boost Pointer Container库,它提供了用于异常安全处理指针的容器.


D.S*_*ley 5

我很确定这里的答案是一个相当强调的"不".根据您的定义,resize()如果我正确读取它,应分配新存储并使用默认构造函数进行初始化.然后,您将通过索引到集合并操纵引用来操纵对象,而不是"插入"到集合中.否则,您需要复制构造函数和赋值运算符.标准库中的所有容器都有此要求.

您可能希望使用类似的东西boost::ptr_vector<T>.由于您正在插入指针,因此您不必担心复制.这将要求您动态分配所有对象.