C++ 在 Vector 中使用不可分配的对象
C++ Use Unassignable Objects in Vector
我想在std::vector
中存储对象列表,但对象包含引用,无法指定。但是,我可以复制构造对象。
能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新拔插指针,但是这样做的语法会显着降低可读性,尤其是在使用迭代器时,我更喜欢替代方案。
不起作用:
std::vector<MyObject> myVector;
//fill the vector
//...
myVector[1] = object1;
智能指针牺牲了可读性:
std::vector<std::unique_ptr<MyObject>> ptrVector;
//fill the vector
//...
ptrVector[1] = std::unique_ptr<MyObject>(new MyObject(object1));
是否有其他方法可以在std::vector
中使用不可分配的对象?
这不是
对您的问题的直接回答,因为我无法提供std::vector
的替代品,也无法提供另一种使用它的方式来让您做您需要做的事情。
但是,如果可以修改MyObject
的定义,则可以选择更改它,以便它使用std::reference_wrapper
而不是传统的引用。这将使MyObject
是可分配的。
例:
#include <vector>
#include <functional>
#include <iostream>
struct MyObject
{
//int &_i;
std::reference_wrapper<int> _i;
MyObject(int &i):_i(i) {}
};
int main() {
std::vector<MyObject> vec;
int i1 = 3;
int i2 = 4;
MyObject c1(i1);
MyObject c2(i2);
/* Storing object. */
vec.push_back(c1);
/* Assigning to it. */
vec[0] = c2;
/* Confirming that it's the correct object now. */
for (const MyObject &it : vec)
std::cout << it._i << std::endl;
/* Modifying the value of its internal reference. */
vec[0]._i.get() = 5;
/* Confirming that the original int changed value indeed. */
std::cout << "i2 == " << i2 << std::endl;
return 0;
}
警告:现有代码可能已经包含对引用成员(即上面代码中称为_i
的成员)的直接赋值。这些赋值旨在更改引用所引用的对象的值。当用std::reference_wrapper
替换引用时,所有直接赋值_i = x
都必须替换为_i.get() = x
,否则程序的语义完全改变。
(编辑)如果使用的引用是常量引用const T&
,则可以使用std::reference_wrapper<const T>
。使用上面的示例,MyObject
的定义将更改为以下内容:
struct MyObject
{
std::reference_wrapper<const int> _i;
MyObject(const int &i):_i(i) {}
};
为什么不让"MyObject"可分配呢?您可以覆盖运算符"=",因此"myVector[1] = object1"将是可行的。
相关文章:
- 我可以为unordered_map分配特定的模组值吗?
- 堆分配对于大型块中的分页是否更有效?
- 如何接受可修改和不可修改的参数?
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 在可拆卸线程完成操作时取消分配内存
- 可视化C++将分配移动到未初始化的对象?
- 在线程中使用堆可分配 >100MB 的 RAM
- 哪种类型特征表明该类型是可分配的?(元组,对)
- C++概念相同且可分配
- 如何使具有包含唯一指针的成员变量的类可复制可分配
- 使用 std::string 参数和不可移动/可复制参数构建 std::map
- 使用不可复制(但可移动)键移动地图分配时出错
- GCC C++11 删除移动可分配类的副本分配会阻止 std::sort 编译
- 如何使具有常量属性的类可分配
- 创建可分配的最大字符数组
- 如何使我自己的容器索引和可分配
- 为Fortran可分配程序在C中分配内存
- 移动包含向量<unique_ptr的可分配类<T>>
- 移动clang和gcc中可分配的lambda
- 对左值和右值的可分配引用