更改已推送的列表(在向量上)是否会更改向量上的列表?

时间:2015-10-17 20:02:57

标签: c++ list vector

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

2 个答案:

答案 0 :(得分:2)

不,除非您有std::reference_wrapper<std::list>的向量,即std::list周围的reference wrapperpush_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

答案 1 :(得分:0)

std::vector会保留您为其元素指定的内容的副本。因此,当您将新值放入最初分配给矢量的外部列表时,def declareWinner(usrchoice, cptrchoice): if usrchoice == cptrchoice: 中的列表不会更改。