为什么在插入stl列表期间此代码会挂起

时间:2013-08-05 08:38:50

标签: c++ stl

为什么在插入stl列表期间此代码会挂起? 我也试过了copy函数,但它也没有用。

#include <iostream>
#include <string>
#include <iterator>
#include <list>
#include<vector>
#include<algorithm>
using namespace std; 

class a{
    list<string> lista;

    public:
    a()
    {

        lista.push_back("ele");
        lista.push_back("phant");
        cout<<"End of Cons"<<endl;
    }

    list<string> getlist()
    {
        cout<<"Getting"<<endl;
        return lista;
    }
};

int main()
{

    a A1;

    list<string> list1;
    list1.insert(list1.end(),A1.getlist().begin(),A1.getlist().end());
    //copy(A1.getlist().begin(),A1.getlist().end(),back_inserter(list1));
    cout<<"End of Prog"<<endl;
    return 0;

}

3 个答案:

答案 0 :(得分:4)

getlist按值返回一个列表,因此list1.insert将迭代器用于其起点和终点的不同列表。

您应该更改getlist以返回对其列表的引用而不是其副本

list<string>& getlist()

答案 1 :(得分:0)

当您从函数返回列表时,使用声明list<type> getlist(),它将不会返回您实际返回的列表(return lista)。相反,它会使该列表(lista)的临时副本返回该副本。因此,当您在insert行中调用两次getlist时,它将返回两个不同列表的开始和结束迭代器,这会产生歧义。

因为@simonc建议您需要更改声明,以便不复制副本并将实际列表返回到调用位置。

答案 2 :(得分:0)

getList返回list的副本,它在迭代器中有自己的内存地址。