例如,我有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;



最好的方法是什么?
有没有使用分配器的方法?

最佳答案

c++11
  
  随着新标准的增加,功能被分配给了分配器类型的对象。
  
  添加的功能之一是,分配器现在也可以进行安置构造。使用复制/移动以外的构造函数构造对象。
  
  

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

  
  
  
  该标准确实保证STL容器必须使用此新功能,并且可以说,您可以实现自己的分配器,仅用于默认初始化非默认可初始化对象的目的。
  
  
  
  这不是最漂亮的解决方案,但是什么都可以使您的船漂浮起来。





  c++03
  
  分配器与对象初始化的那部分无关,它的唯一目的是分配/取消分配内存,您所指的初始化类型在其他地方完成。
  
  当有人要求分配器执行新的放置,并且传递给该copy-ctor的值已经在其他地方建立时,分配器将调用的唯一构造器是copy-constructor。
  
  总结:不,您不能使用分配器,因此可以解决此特定问题。




什么时候std :: vector需要使用default-ctor?

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


您可以在适当的构造函数重载中指定std::vector的元素数量,但不提供默认值
您使用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()!?

然后,您有两个,三个,四个选项:


使用使用分配器的C ++ 11方法
使您的对象具有默认构造函数
用非常薄的包装器包装您的对象,该包装器的唯一用途是默认初始化包含的对象(说起来容易,然后在某些情况下可以做到)
“在boost :: optional中包装[对象]实际上为任何类型提供了默认的ctor”-@ Xeo

关于c++ - 如何初始化存在于STL容器中的类的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11502601/

10-14 16:56
查看更多