使用双迭代器引用映射中的列表

Using double iterators to refer the list in the map

本文关键字:列表 映射 引用 迭代器      更新时间:2023-10-16

我尝试使用类似map的结构。当我尝试使用迭代器引用列表元素时,发生了错误。遵循代码。

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->秒应表示映射中的列表。如果我将列表分配给列表对象,它就可以正常工作。为什么当我使用"it->second.begin(("时它不起作用?谢谢你的回答。

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

这是因为您正在尝试迭代常数的 it->second。尝试替换

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){

这应该有效。