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

ham*_*rti 1 c++ reference vector c++14

我有以下结构:

#include <string>
#include <vector>

struct A {
    std::string name;
    int id;
};
Run Code Online (Sandbox Code Playgroud)

并且包含A元素的向量:

std::vector<A> a_vector;
Run Code Online (Sandbox Code Playgroud)

我试图将一个元素附加到向量并使用以下内容更改其值:

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. 
}
Run Code Online (Sandbox Code Playgroud)

其中get_a定义为:(代码是简化的,在真正的代码中我真的需要传递一个as参数而不是将其作为返回)

void get_a(A& a) //This function normally assigns a in different ways
{
    a_vector.emplace_back();
    a = a_vector.back();
}
Run Code Online (Sandbox Code Playgroud)

如何让a元素与向量中的元素相同?我真的必须使用指针吗?

Vit*_*meo 6

A a;
a = a_vector.back();
Run Code Online (Sandbox Code Playgroud)

在这里你是复制分配a_vector.back()给a.这不是引用,因此修改a不会修改向量内的元素.

你想要这个:

A& a = a_vector.back();
Run Code Online (Sandbox Code Playgroud)

如果您无法立即初始化参考a_vector.back(),请考虑使用指针...

A* a;

// ...

a = &a_vector.back();

// ... 

something(*a);
Run Code Online (Sandbox Code Playgroud)

......或索引:

std::size_t a_idx;

// ...

a_idx = a_vector.size() - 1;

// ... 

something(a_vector[a_idx]);
Run Code Online (Sandbox Code Playgroud)
  • 如果您知道向量将不会调整大小,指针将正常工作.如果向量调整大小,则迭代器和指针将失效.

  • 只要不移除/移动元素,即使向量调整大小,索引也能正常工作.