使用双迭代器来引用地图中的列表

时间:2018-01-30 05:47:24

标签: c++ list dictionary iterator

我尝试使用像map这样的结构。当我尝试使用迭代器来引用list元素时,发生了一些错误。 代码被遵循。

map<string,list<string>> node;
void ContructGraph(vector<string>& wordList){
    for(int i=0;i<wordList.size();i++){
        list<string> *tem=new list<string>();
        tem->push_back(wordList[i]);
        for(int j=0;j<wordList.size();j++){
            if(CheckDifference(wordList[i],wordList[j]))tem->push_back(wordList[j]);
        }
        node.insert(std::pair<string,list<string>>(wordList[i],*tem));

    }
    for(int i=0;i<wordList.size();i++){
        visited.insert(std::pair<string,bool>(wordList[i],false));
        nodeLength.insert(std::pair<string,int>(wordList[i],0));

    }
    for(map<string,list<string>>::const_iterator it=node.begin();it!=node.end();++it){
        cout<<"node "<<it->first<<endl;
        list<string> newList=it->second;// no error
        std::list<string>::iterator newIterator =(newList).begin();//no error
        std::list<string>::iterator newnewIterator=(it->second).begin();// with error
        /*
        for(std::list<string>:: const_iterator s_it=it->second.begin();s_it!=it->second.end()+s_it){
            cout<<*s_it<<" ";
        }
        */
        cout<<endl;
    }

错误消息是

conversion from 'std::__cxx11::list<std::__cxx11::basic_string<char> >::const_iterator {aka std::_List_const_iterator<std::__cxx11::basic_string<char> >}' to non-scalar type 'std::__cxx11::list<std::__cxx11::basic_string<char> >::iterator {aka std::_List_iterator<std::__cxx11::basic_string<char> >}' requested

根据我的理解,迭代器就像指向元素的指针一样。 it-&gt; second应代表地图中的列表。如果我将列表分配给列表对象,它只是工作正常。当我使用“it-&gt; second.begin()”时为什么它不起作用?谢谢你的回答。

2 个答案:

答案 0 :(得分:2)

itconst_iterator。因此it->secondconst(it->second).begin()也是const_iterator。因此newnewIterator需要std::list<string>::const_iterator。如果你的编译器足够新,可以使用auto newnewIterator来支持它。

答案 1 :(得分:0)

这是因为你正在尝试迭代它 - >&gt;秒是常量。 尝试替换

for(map<string,list<string>>::const_iterator it=node.begin();it!=node.end();++it){

for(map<string,list<string>>::iterator it=node.begin();it!=node.end();++it){

这应该有用。