我正在尝试检查给定的密钥是否在地图中,有些不能这样做:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
Run Code Online (Sandbox Code Playgroud)
那么如何打印p中的内容呢?
我已经在stackoverflow上阅读了关于web和问题的不同文章,但对我来说,目前尚不清楚是否有更好的std::map::at用于检索map元素的情况.
根据定义,std::map::at
返回对使用键k标识的元素的映射值的引用.
如果k与容器中任何元素的键不匹配,则该函数抛出out_of_range异常.
仅限于我std::map::at在100%确定存在具有特定键的元素时值得使用的情况,否则您应该考虑异常处理.
std::map::at被认为是最有效和优雅的方式?在什么情况下你会建议使用std::map::at?map::find()当有可能没有带有这样一个键的元素时,最好使用它吗?并且map::find()它更快,更好的方法?Run Code Online (Sandbox Code Playgroud)if ( map.find("key") != map.end() ) { // found } else { // not found }
PS
map::operator[] 有时可能很危险,因为如果一个元素不存在,那么它会插入它.
我需要映射值之间的范围lowerBound,并upperBound以一定的价值.
说明性示例:
例如,假设我有GPS系统,用户订阅了它.该系统能够为我提供用户与某一点的距离.根据用户的距离,我想为他们分配一个ID.
从而远离用户
1以100获得ID: 8.4101以200获得ID: 7.2 201以300获得ID: 3.6401以600获得ID: 4.1 等等...
我的方法:
所以我做了什么,我创建了一个std::map初始化如下:
std::map<int, double> distanceToIdMap;
distanceToIdMap =
{
{100, 8.4},
{200, 7.2},
{300, 3.6},
};
Run Code Online (Sandbox Code Playgroud)
然后我使用此代码获取给定距离的ID:
double roundUpToHundred = std::ceil(realDistance / 100.0) * 100;
double powerForDistance = distanceToIdMap.at(roundUpToHundred);
Run Code Online (Sandbox Code Playgroud)
然而,我的方法401对于600距离来说是分解的,因为天花板到距离的最接近的百度400+我得到的值500我在地图中没有条目.当然,平凡的解决办法是添加一个条目500的distanceToIdMap,但是这是我不希望如何处理这个问题.
我想有一个{(lowerbound, upperbound) , …