如何初始化stl容器中存在的类的数据

how to init data of class that exists in stl container?

本文关键字:存在 数据 初始化 stl      更新时间:2023-10-16

例如,我有一个类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

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

当有人要求分配器执行放置新时,分配器将调用的唯一构造函数是复制构造函数,并且传递给副本构造函数

概括起来不,您不能使用分配器来解决这个特定的问题


std::vector何时需要使用默认ctor

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

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

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


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

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. 使用Allocators 的C++11方法

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

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

  4. ";在boost::optional中包装[对象]实际上会给任何类型一个默认的ctor"-@Xeo