std::包含原子的类的向量
std::vector of class containing atomic
我正在尝试创建一个包含类实例的向量,该类又包含(除其他外(std::atomic。
我已经尝试了几种:
- 如果未指定复制构造函数,编译器将给出有关要删除的构造函数的错误。
如果指定了复制构造函数,我尝试了两件事:
使用 Foo(Foo& Other(,它会抱怨没有找到 Foo 的复制构造函数。
编辑:复制构造函数是foo(foo& other(:atomic(other.atomic.load((( {}
使用 FOO(const Foo& other(,它会抱怨 std::atomic 没有 const copy 构造函数。
编辑:复制构造函数是foo(const foo& other(:atomic(other.atomic.load((( {}
我完全不知道如何解决这个问题,所以任何帮助都非常感谢
std::atomic
在设计上既不可复制也不可移动。对std::vector
的操作导致其重新分配,要求其元素至少是可移动的。因此,您有以下选择:
- 停止在元素类中存储
std::atomic
。也许可以使用std::unique_ptr<std::atomic>
来代替。 - 停止将元素类直接存储在向量中,而是存储
std::unique_ptr<ElementClass>
(如 @Richard Critten 在注释中建议的那样(。 - 为您的类编写一个复制或移动构造函数和赋值运算符,这将以某种方式解决
std::atomic
的不可移动性。 -
为您的类提供虚拟复制/移动操作以满足编译器的要求。然后,使用
reserve
在向量中预分配空间,然后仅使用附加元素(最多到预分配大小(、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。鉴于这种方法的脆弱性,我建议采取两种预防措施:
- 让假人投掷,以便您尽快抓住任何违反"不调整大小"要求的行为。
- 不要直接使用
std::vector
,而是用适当限制的界面将其包装在您自己的NonResizableVector<T>
中,并对其进行大量记录。
您应该(甚至可以(使用其中哪一个取决于您的类实际执行的操作。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 在向量内的向量上迭代
- 向量上的线性搜索
- 使用向量类的c++指针
- 添加存储在向量中的大整数的函数出现问题
- 使用迭代器时如何访问对象在向量中的位置?
- 为什么一个向量上的多线程操作很慢
- C++中原子的替代品<variant>
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 将转换字符键入 int 以用作向量C++的索引
- 在C++中初始化向量映射的最有效方法
- C++重新引用向量中的值
- 选择和修改嵌套向量中的条目的最佳实践
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 以C++递归方式查找向量中的最大值
- std::包含原子的类的向量