gpt4 book ai didi

C++ 在 Vector 中使用不可赋值的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:09 25 4
gpt4 key购买 nike

我想在 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) {}
};

关于C++ 在 Vector 中使用不可赋值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com