gpt4 book ai didi

c++ - 调整大小后保持对 vector 元素的引用有效

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:00 25 4
gpt4 key购买 nike

如果我们引用一个 vector 元素然后调整 vector 的大小,该引用将不再有效,迭代器也会发生同样的情况:

std::vector<int> vec{0, 1, 2, 3, 4, 5};
int& ref = vec[0];
auto itr = vec.begin();

cout << ref << " " << *itr << endl;

vec[0] = 7;

cout << ref << " " << *itr << endl;

vec.resize(100);
vec[0] = 3;

cout << ref << " " << *itr << endl;

打印出来:

0 0
7 7
0 0 // We expected a 3 here

而且我知道只保留对 vector 本身的引用并调用 vec[0] 会更实际,但只是为了提问,是否可以保留一个始终为 vec[0 的对象] 即使对象被移动了?

我已经尝试编写一个小的辅助类来帮助解决这个问题,但我不确定这是否是最好的方法,或者它是否会失败?

template<typename T>
struct HelperClass
{
std::vector<T>& vec;
size_t element;

HelperClass(std::vector<T>& vec_, size_t element_) : vec(vec_) , element(element_) {}

// Either define an implicit conversion from HelperClass to T
// or a 'dereference' operator that returns vec[0]
operator T&() { return vec.at(element); }
T& operator*() { return vec.at(element); }
};

并通过隐式转换为 T& 或“取消引用”运算符来使用它:

std::vector<int> vec{0, 1, 2, 3, 4, 5};
int& ref = vec[0];
auto itr = vec.begin();
HelperClass<int> hlp = HelperClass<int>(vec, 0); // HelperClass

cout << ref << " " << *itr << " " << hlp << " " << *hlp << endl;

vec[0] = 7;

cout << ref << " " << *itr << " " << hlp << " " << *hlp << endl;

vec.resize(100);
vec[0] = 3;

cout << ref << " " << *itr << " " << hlp << " " << *hlp << endl;

它已经打印了异常(exception)的内容:

0 0 0 0 
7 7 7 7
0 0 3 3

那么,除了使用辅助类之外,还有更好的方法来做到这一点吗?辅助类在某些情况下是否不可靠?

我也遇到过 this reddit 上的线程,但他们似乎不在那里讨论 helper 类

最佳答案

您可以做的一件事是拥有一个指针 vector 而不是一个实例 vector 。这当然有其自身的一系列问题,但如果您必须让对象引用在 vector 调整大小后幸存下来,那就可以了。

关于c++ - 调整大小后保持对 vector 元素的引用有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867703/

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