如何初始化stl容器中存在的类的数据
how to init data of class that exists in stl container?
例如,我有一个类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
仅在两种情况下使用其所持有类型的默认构造函数:
-
您在适当的构造函数重载中指定
std::vector
的元素数量,但不提供默认值 -
使用
std::vector<T>::resize (n)
并增加容器中对象的数量(注意没有为成员函数指定第二个参数)
考虑到以上内容,我们可以使用容器做很多事情,而无需在对象中提供默认构造函数,比如初始化它以包含值为X的N元素。
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()
然后你有两个,三个,四个选项:
使用Allocators 的C++11方法
使您的对象具有默认的构造函数
用一个非常薄的包装器包装你的对象,包装器的唯一目的是默认初始化包含的对象(在某些情况下,这可能说起来更容易,做起来更容易)
";在boost::optional中包装[对象]实际上会给任何类型一个默认的ctor"-@Xeo
相关文章:
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 将数据定向到不存在的阵列中
- 将数据保存在.cpp上,并在 .h 上运行
- 将数据保存在C++中,从 Python 加载 - 推荐的数据格式
- 仅当数据竞赛存在与锁定时,OpenMP关键部分
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 是否存在与将数据流式传输到 c++ 异常类相关的任何危险
- 如何从C 中的HDF5文件中读取属性名称和数据集名称,在这里我不知道HDF5文件中存在什么属性
- 如何检查链表中的数据是否存在C++
- 原子线程围栏:为什么在这个非原子变量上存在数据竞争?这有关系吗
- 即使在返回值之前释放后,数据仍在指针中仍然存在
- 结构数据D = {0}和结构数据D = {}之间是否存在任何区别
- C++简体版链表,当我加载数据以创建链表并输入更多数据时,似乎存在差距
- 在堆栈C++上创建的对象中存在无效数据
- 将数据保存在std :: vector或.txt文件中的速度更快
- 关于返回对不存在数据的引用的设计
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- 这段代码中是否存在数据竞争?
- 如何将数据追加到存在数据的文件中