gpt4 book ai didi

C++ 我想避免使用指针,而是使用 STL 和引用来维护小型数据缓存

转载 作者:行者123 更新时间:2023-11-28 04:29:19 25 4
gpt4 key购买 nike

#include <iostream>
#include <vector>
#include <string>


struct A
{
std::string a;
std::vector<A> avector;
};

typedef std::vector<A> Avector;

A& func(A& x)
{
A& ret = x.avector[0];
return ret;
}

int main()
{
A genesis = { "Parent", std::vector<A>() };
A l1 = { "Child1", std::vector<A>() };
A l2 = { "Child2", std::vector<A>() };

genesis.avector.push_back(l1);
genesis.avector.push_back(l2);

std::cout << "l1: " << l1.a << std::endl; //shows "Child1"
std::cout << "l2: " << l2.a << std::endl; //shows "Child2"

A& lx = func(genesis);
lx.a = "Childx";

std::cout << "l1: " << l1.a << std::endl; //!!still shows "Child1"

return 1;
}

所以,基本上我想要的是总体上有一个数据拷贝,即 Genesis 对象和另外两个对象 l1 和 l2 作为 Genesis.avector 的对象

但是我以后无法修改它,因为每次我最终修改拷贝而不是 Genesis 对象下的实际数据时。

感谢您的帮助!

最佳答案

在您的代码中:

A genesis = { "Parent", std::vector<A>() };
A l1 = { "Child1", std::vector<A>() };
A l2 = { "Child2", std::vector<A>() };

genesis .avector.push_back(l1);
genesis .avector.push_back(l2);

您有 5 个 A 实例。您声明的 3 个拷贝和 vector 中的 2 个拷贝。

所以更正确(但可能有错误)的方法是:

A genesis = { "Parent", std::vector<A>() };
genesis .avector.emplace_back("Child1", std::vector<A>());
genesis .avector.emplace_back("Child2", std::vector<A>());

A& l1 = genesis.avector[0];
A& l2 = genesis.avector[1];

现在您只有 3 个实例。 l1 和 l2 是 vector 中项目的引用,因此对它们的更改也会反射(reflect)在 vector 中。

我说过这可能有问题。当您更改 vector (添加其他内容)时, vector 可能必须重新分配,因此您拥有的任何引用都将无效,结果是未定义的行为。

如果你确实需要修改 vector ,我会做 vector<unique_ptr<A>> .那么A& l1 = *genesis.avector[0]这将一直有效,直到该项目从 vector 中移除。

你也可以试试std::reference_wrapper而不是 unique_ptr如果您希望对象存在于堆栈中。我会尽量避免这种情况,因为从 vector 中删除比局部变量超出范围更容易破坏某些东西。

关于C++ 我想避免使用指针,而是使用 STL 和引用来维护小型数据缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53340535/

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