我尝试使用像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()”时为什么它不起作用?谢谢你的回答。
答案 0 :(得分:2)
it
是const_iterator
。因此it->second
为const
,(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){
这应该有用。