C ++函数从列表中找到最小值。此函数是否正确,因为返回的迭代器失效

时间:2014-11-04 06:43:24

标签: c++ list templates pointers iterator

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 任何人都可以解释我的原因吗?

,,

1 个答案:

答案 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