0

例如,我有 A 类:

 class A{
           int value_;
           public:
           A(A& a){
                value_ = a.value_;
           }
           A(int value){
                value_ = value;
           }
 };

我想要一个 A 类的向量,但我想A(int value)为所有这些传递一个值。

 std::vector<A,allocator<A>> my_vector;
  • 最好的方法是什么?
  • 有没有办法使用分配器?
4

1 回答 1

2

随着新标准的增加,分配器类型的对象被赋予了功能。

添加的功能之一是分配器现在允许进行安装,也就是。使用复制/移动以外的构造函数构造对象。


template< class U, class... Args > void construct( U* p, Args&&... args );

该标准确实保证 STL 容器必须使用这个新特性,并且说您可以实现自己的分配器,只是为了默认初始化一个不可默认初始化的对象。


这不是最漂亮的解决方案,但无论你的船漂浮什么......

分配器与对象初始化的那部分无关,它的唯一目的是分配/释放内存,您所指的初始化类型在其他地方完成。

分配器将调用的唯一构造函数是复制构造函数,当有人要求它执行放置新时,传递给该复制构造函数的值已经在其他地方建立。

总结一下;不,您不能使用分配器来解决这个特定问题。


std::vector 何时需要使用default-ctor

std::vector仅在两种情况下使用它所拥有的类型的默认构造函数:

  1. std::vector在适当的构造函数重载中指定元素的数量,但提供默认值

  2. 您使用std::vector<T>::resize (n)并增加容器中的对象数量(请注意缺少指定成员函数的第二个参数)


考虑到上述内容,我们可以使用容器做很多事情,而无需在我们的对象中提供默认构造函数,例如将其初始化为包含N个值为X的元素。

struct A{
  A (A const& a)
   : value_ (a.value_) 
  { } 

  A (int value)
    : value_ (value)
  {}  

  int value_;
};

int
main (int argc, char *argv[])
{
  std::vector<A> vec (5, A(1)); // initialize vector with 5 elements of A(1)

  vec.push_back (A(3));         // add another element
}

但我真的希望能够使用vec.resize()!?

然后你有两个三个、四个选项:

  1. 使用使用分配器的C++11方法

  2. 使您的对象具有默认构造函数

  3. 用一个非常薄的包装器包装您的对象,其唯一目的是默认初始化包含对象(在某些情况下这可能更容易说然后做)

  4. “在 boost::optional 中包装 [对象] 实际上为任何类型提供了默认 ctor” - @ Xeo

于 2012-07-16T10:46:19.073 回答