【问题标题】:Using vector::back() to modify vector element使用 vector::back() 修改向量元素
【发布时间】:2018-05-15 10:56:17
【问题描述】:

我有以下结构:

#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 定义为:(代码被简化,在实际中我确实需要传递 a 作为参数而不是返回)

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

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

【问题讨论】:

  • 因为你正在复制它 A a;说。使用参考:A &a = a_vecotr.back();
  • 为什么投反对票?我们是否以显而易见的理由投票?这个问题写得很好。
  • @hamzakeurti:我个人不同意对这个问题的反对意见,正如我已经提到的那样。但是您可以通过编写一个可编译的示例来改进它。
  • @hamzakeurti:你应该在这里做,在你之前问过的任何问题中。也不要实质性地更改问题(就像您在最近的编辑中所做的那样),因为这会使答案无效。
  • 这是一个很好的例子,为什么...minimal reproducible example 中没有位置;)。为什么要预先声明引用 a 并将其传递给其他函数,而无论如何您以后想将最后一个元素分配给它?似乎您想对两个不相关的事情使用相同的变量,只是不要这样做。

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


【解决方案1】:
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]);
  • 如果您知道向量不会调整大小,则指针将正常工作。如果向量调整大小,迭代器和指针将失效。

  • 即使调整了向量的大小,只要元素没有被移除/移动,索引也能正常工作。

【讨论】:

  • 感谢您的回答!但是我们可以在两个不同的语句中进行引用声明和引用赋值吗? (见问题编辑)
  • @hamzakeurti:见我的编辑。
【解决方案2】:

你需要一个对象的引用:

auto& a = a_vector.back();

或者,以更紧凑的方式:

a_vector.back().id = 2;

您持有的是副本,而不是原始对象。这就是为什么vector中的对象没有被修改。


对已编辑问题的回答:只能在声明期间分配引用。你想要的可能是std::reference_wrapper,但不管怎样,除非你必须,否则请不要使用它。

【讨论】:

  • 感谢您的回答!但是我们可以在两个不同的语句中进行引用声明和引用赋值吗? (见问题编辑)
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多