没有通过引用[重复]看到动作对向量的最后一个元素的影响

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有通过引用[重复]看到动作对向量的最后一个元素的影响相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我似乎并不完全理解C ++引用是如何工作的。尝试运行以下代码段:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> test{1,2,3};
    int& ref = test.back();
    auto lambda = [&ref, &test](){
        std::cout << "inside lambda " << ref << std::endl;
        ref += 1;
        for (auto&v : test) { std::cout << v << " "; }
    };

    lambda(); lambda(); lambda();
    test.push_back(5);
    lambda(); lambda(); lambda();
}

得到了这个结果:

inside lambda 3                                                                                                                                                                       
1 2 4                                                                                                                                                                                 
inside lambda 4                                                                                                                                                                       
1 2 5                                                                                                                                                                                 
inside lambda 5                                                                                                                                                                       
1 2 6                                                                                                                                                                                 
inside lambda 6                                                                                                                                                                       
1 2 6 5                                                                                                                                                                               
inside lambda 7                                                                                                                                                                       
1 2 6 5                                                                                                                                                                               
inside lambda 8                                                                                                                                                                       
1 2 6 5  

为什么在完成push_back后,没有一个向量元素递增?从这一刻起ref指向哪里?

答案

一开始,ref引用了test存储的第三个元素。在推回一个新元素之后,vector重新分配了它的存储,因此旧的ref元素不再有效。您的代码会导致未定义的行为。

以上是关于没有通过引用[重复]看到动作对向量的最后一个元素的影响的主要内容,如果未能解决你的问题,请参考以下文章

我如何删除向量中的重复值,除了最后一个

按最后一个元素对向量进行排序

通过引用传递向量然后调用清除

构造过程中对向量中元素的引用

访问未初始化的元素时,std向量不会抛出out_of_range异常[重复]

取消引用指向访问元素的向量指针