gpt4 book ai didi

c++ - 如何管理 std::list 元素作为引用?

转载 作者:IT老高 更新时间:2023-10-28 23:11:31 28 4
gpt4 key购买 nike

我有以下代码:

struct Foo {
int var1;
int var2;


friend std::ostream& operator<<(std::ostream& os, const Foo& s){
return os << "[Foo] " << s.var1 << "," << s.var2 ;
}
};

int main() {
Foo foo;
foo.var1 = 1;
foo.var2 = 2;
std::list<Foo> list;
list.push_back(foo);

Foo &foo2 = list.front();
foo2.var2 = 5;

std::cout << "foo (" << &foo << "): " << foo << std::endl;
std::cout << "foo2 (foo from list) (" << &list.front() << "): " << foo2 << std::endl;
}

我希望 foofoo2 都引用同一个对象。因此,当我将 5 分配给 foo2.var2 时,我也想修改 foo.var2。然而,正如我们在以下输出中看到的那样,这并没有发生:

foo (0x7fffffffe140): [Foo] 1,2
foo2 (foo from list) (0x61ac30): [Foo] 1,5

这样做的正确方法是什么?

最佳答案

当您使用 push_back 时将元素插入列表,push_back创建一个插入到列表中的拷贝。一个解决方案是使用 std::reference_wrapper 而是作为列表的基础类型,例如

std::list<std::reference_wrapper<Foo>> lst;

然后像这样推进去

lst.push_back(foo);

这是一个 super 简单的示例,向您展示它是如何工作的:

#include <functional>
#include <iostream>
#include <list>

int main()
{
int i = 42;
std::list<std::reference_wrapper<int>> lst;

lst.push_back(i); // we add a "reference" into the list
lst.front().get() = 10; // we update the list
std::cout << i; // the initial i was modified!
}

Live on Coliru

您需要 reference_wrapper因为您不能简单地创建引用列表,例如 std::list<Foo&> .或者,您可以使用指针,但我发现 reference_wrapper方法更透明。

在上面的简单示例中,请注意需要使用 std::reference_wrapper::get() 获取基础引用,如 reference_wrapper位于赋值运算符的左侧,因此不会隐式转换为 int通过 [ std::reference_wrapper::operator T& .

以下是修改为使用 reference_wrapper 的完整工作代码年代:

http://coliru.stacked-crooked.com/a/fb1fd67996d6e5e9

关于c++ - 如何管理 std::list 元素作为引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44165193/

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