c++ - 更改已推送的列表(在 vector 上)是否会更改 vector 上的列表?

标签 c++ list vector

例如,我们有一个列表 vector 。然后我们在 for 循环中将列表 i 推送到 vector[0] 上。然后随着循环迭代,我们继续 vector[1] 并为列表 i 分配新值,然后将其推送到 vector[1]。被推送到 vector[0] 上的列表 i 也会改变吗?谢谢。

最佳答案

不,除非你有 std::reference_wrapper<std::list> 的 vector ,即 reference wrapper 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

关于c++ - 更改已推送的列表(在 vector 上)是否会更改 vector 上的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191030/

相关文章:

python - 如何将我的数据框转换为二维列表,并将所有列作为列表

python - 从文件列表中去除标点符号

c++ - 如何对 vector 进行二进制搜索以查找具有特定 id 的元素?

关于监听器的 Java 并发问题

c++ - 在 C++ 中将输入直接输入到 vector 中

C++我应该覆盖派生类中的复制构造函数吗

c++ - 如果类数组中的 vector 是动态 push_backed,内存如何工作?

c++ - 通过对象指针访问成员

c++ - 为什么我必须明确地转换一个我已经指定了底层类型的枚举?

C 列表段错误