我有以下结构:
#include <string>
#include <vector>
struct A {
std::string name;
int id;
};
包含A元素的向量:
std::vector<A> a_vector;
我试图将一个元素附加到向量并使用以下内容更改其值:
void test()
{
A a;
get_a(a);
//Up to this point I thought modifying this a object would mean modifying the back element of the vector. But it doesn't work as planned, doing this:
a.id = 2; //Doesn't modify the id of the element in the vector.
}
其中get_a定义为:(代码是简化的,在真正的代码中,我真的需要传递一个as参数而不是将其作为返回)
void get_a(A& a) //This function normally assigns a in different ways
{
a_vector.emplace_back();
a = a_vector.back();
}
如何让a元素与向量中的元素相同?我真的必须使用指针吗?
答案 0 :(得分:6)
A a;
a = a_vector.back();
在此,您将a_vector.back()
复制分配给a
。这不是引用,因此修改a
不会修改向量内的元素。
你想要这个:
A& a = a_vector.back();
如果您无法使用a_vector.back()
立即初始化参考,请考虑使用指针...
A* a;
// ...
a = &a_vector.back();
// ...
something(*a);
...或索引:
std::size_t a_idx;
// ...
a_idx = a_vector.size() - 1;
// ...
something(a_vector[a_idx]);
如果您知道向量不会调整大小,指针将正常工作。如果向量调整大小,迭代器和指针将失效。
只要不移除/移动元素,即使向量调整大小,索引也能正常工作。
答案 1 :(得分:3)
您需要对该对象的引用:
auto& a = a_vector.back();
或者,以更紧凑的方式:
a_vector.back().id = 2;
您持有副本,而不是原始对象。这就是为什么矢量中的对象不会被修改的原因。
回答已编辑的问题:只能在声明期间分配参考。你想要的可能是std::reference_wrapper
,但无论如何,请不要使用它,除非你必须这样做。