map<int,string> h;
h[1]="q";
h[20]="d";
h[3]="s";
h[90]="l";
h[9]="f";
map<int,string>::iterator it;
for(it=h.begin();it!=h.end();++it)
cout<<it->first<<"\t";
cout<<"\n"<<h.end()-- ->first;
map<int,string> h;
h[1]="q";
h[20]="d";
h[3]="s";
h[90]="l";
h[9]="f";
map<int,string>::iterator it;
for(it=h.begin();it!=h.end();++it)
cout<<it->first<<"\t";
cout<<"\n"<<h.end()-- ->first;
该函数
end返回一个指向容器最后一个元素之后不存在的元素的迭代器。只需要在循环中将当前迭代器与它进行比较。它不能被取消引用。您在应用递减运算符时出错。后缀减量运算符创建操作数的副本(在您的例子中是 iterator
end),然后将原始对象(而不是副本)减一,然后返回先前创建的副本。没有对副本应用缩减操作,因此构造返回的值h.end()--是相同的 iteratorend。它不能被取消引用。该怎么办?使用前缀递减操作或函数
std::prev:该函数
std::prev也很好,因为它可以找到并返回前一个迭代器,而不管递减运算符是否可以应用于右值。例如,递减在这段代码中不起作用:如果迭代器的递减量根本没有定义,那么该函数
std::prev将无济于事。例如,让我们使用一个容器迭代器std::forward_list:一些编译器可以吞下这个,但它不会工作。比如x86_64 gcc 12.2编译成功,但是程序崩溃。并且 Visual Studio 在编译时给出了以下错误: