改变一个已经压入的列表(在vector对象上)会改变vector对象上的列表吗?

Does changing an already pushed list(on a vector) change the list that is on a vector?

本文关键字:改变 对象 列表 vector 一个      更新时间:2023-10-16

例如,我们有一个列表向量。在for循环中将list i压入vector[0]。然后在循环迭代时,移到vector[1],并给list i赋新值,然后将list i压入vector[1]。在vector[0]上被压入的list I也会改变吗?谢谢你!

不,除非你有一个std::reference_wrapper<std::list>的向量,即std::list周围的参考包装器。push_back复制值(或移动右值)。请注意,您不能有一个纯引用的容器,这就是为什么您需要std::reference_wrapper,以防您想要"模拟"将引用推回容器。

代码示例如下:

#include <iostream>
#include <list>
#include <functional>
#include <vector>
template<typename T>
void display(T const& container)
{
    for (auto && elem : container)
    {
        for (auto && i : elem)
        {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    }
}
template<typename T>
void display_ref(T const& container)
{
    for (auto && elem : container)
    {
        for (auto && i : elem.get())
        {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    }
}
int main()
{
    std::vector<std::list<int>> v1;
    std::vector<std::reference_wrapper<std::list<int>>> v2;
    std::list<int> l{1, 2, 3};
    v1.push_back(l);
    v2.push_back(l);
    // modify l
    l.front() = 42;
    // display
    display(v1); // unchanged
    display_ref(v2); // changed
}

Live on Coliru

std::vector保存了你赋给它的元素的值的副本。因此,当您将新值放入您最初分配给向量的外部列表中时,vector[0]中的列表将不会改变。