0

为什么此代码在插入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;

}
4

3 回答 3

4

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

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

list<string>& getlist()
于 2013-08-05T08:40:04.803 回答
0

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

因此,正如@simonc 建议的那样,您需要更改声明,以便不完成复制并将实际列表返回到调用位置。

于 2013-08-05T08:50:12.057 回答
0

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

于 2013-08-05T09:07:51.737 回答