[英]std::map find distance with iterators, program does not terminate
当我编译( g++ -std=c++14 map.cpp
)并运行这个程序时,它似乎没有终止。 任何人都可以解释为什么? 然而,当我找到('a')而不是'c'时,它给出了一个零。
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
map<char, float> m;
m['a'] = 3.4;
m['b'] = 5.3;
m['c'] = 33.3;
m['d'] = 43.;
auto it = m.find( 'c' );
cout << "distance : " << std::distance( it , m.begin() ) << endl;
}
利用
std::distance( m.begin(), it )
否则调用
std::distance( it , m.begin() )
具有未定义的行为,因为使用了无效范围。 C++ 中的范围被指定为[first, last )
,其中 first 优先于或等于 last。 在第一个等于最后一个的最后一种情况下,范围为空。
来自 C++ 标准(27.4.3 迭代器操作)
4 效果:如果 InputIterator 满足随机访问迭代器的要求,则返回(last - first); 否则,返回从 first 到 last 所需的增量数。
std::distance(first,last)
从first
开始运行并推进迭代器直到到达last
。 在您的情况下,这永远不会发生,因为it
很可能在m.begin()
之后找到,所以它会永远循环。 更改给std::distance
的参数顺序
标准::距离参考:
如果 last 不能通过(可能重复)首先递增从 first 到达,则行为未定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.