使用vector :: back()修改向量元素

时间:2017-12-01 10:43:05

标签: c++ vector reference c++14

我有以下结构:

#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元素与向量中的元素相同?我真的必须使用指针吗?

2 个答案:

答案 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,但无论如何,请不要使用它,除非你必须这样做。