首页 > 解决方案 > std::map 使用迭代器查找距离,程序不会终止

问题描述

当我编译 ( 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;

}

标签: c++iteratorrangedistancestdmap

解决方案


采用

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 所需的增量数


推荐阅读