list<LNode>::iterator minI(list<LNode>::iterator start,list<LNode>::iterator end)
{
list<LNode>::iterator min_index=start;
for(auto it=start;it!=end;it++)
{
if(it->len<min_index->len)
min_index=it;
}
return min_index;
}
在main()
中...
cout<<(&(*vnode.begin()))<<endl;
auto min_it=minI(vnode.begin(),vnode.end());
cout<<(&(*vnode.begin()))<<endl;
cout<<(&(*min_it))<<endl;
char ch;
int i=min_it->i,j=min_it->j;
printf("\n%s\t%s\t%s\t%s\t%s\t",t1[i].from,t1[i].to,t1[i].flight,t2[j].city,t2[j].discount);
scanf("%s",&ch);
cout<<(&(*min_it))<<endl;
...
而前三个cout打印0x600d88 最后一个cout打印0x600d08 任何人都可以解释我的原因吗?
,,
答案 0 :(得分:2)
迭代器不会失效。
通常,只有在修改容器时,标准容器上的迭代器才能失效。在list
的情况下,只有在删除它们引用的元素时,它们才会失效。
在第二段代码中,scanf
被赋予一个指向单个字符的指针,但会覆盖至少两个:用户输入的任何字符,后跟终结符。这会给出未定义的行为,这可能会很好地修改局部变量的值(如min_it
)。尝试用更安全的C ++等价物替换它
std::string ch;
std::cin >> ch; // to read one word, or
std::getline(std::cin, ch); // to read a whole line