c++ - 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;
}
解决方案
采用
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 所需的增量数。
推荐阅读
- azure - 注意 PSObject 中的属性未在 Foreach 循环中填充 | NSG 详细信息导出到 CSV
- python - Pandas agg 根据调用定义实现不同的行为
- excel - 如何调试简单的 Worksheet_Change
- r - 使用for循环从旧数据帧形成新数据帧
- css - 覆盖 Angular 组件中的引导程序版本
- ftp - 使用 ftp 对 Angular 项目实施持续部署
- javascript - 无法使用 axios 从 firebase 数据库中删除数据
- c# - 如何使用 Graph API 设置主 SMTP 地址?
- rest - Codeigniter 301 永久移动
- javascript - 如何在按钮单击时水平添加输入框