我需要映射值之间的范围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) , correspondingID}结构图,所以我可以解决ID覆盖距离超过100米的情况.和一个给定的可以检查是否lowerBound< realDistance< upperBound然后提供ID.
这听起来像是std::lower_bound的一个用例。请注意,这lower_bound是正确的实现,而不是upper_bound. 该代码可以编译并运行。不需要map排序,因为它已经排序了。这应该在O(log(N))中运行。
你需要捕获异常......
#include <iostream>
#include <algorithm>
#include <map>
#include <stdexcept>
using namespace std;
std::map<int, double> distanceToIdMap =
{
{100, 8.4},
{200, 7.2},
{300, 3.6},
{600, 4.1}
};
double Distance(int user)
{
auto x = std::lower_bound(distanceToIdMap.begin(), distanceToIdMap.end(), std::pair<const int,double>(user,0));
if (x == distanceToIdMap.end()) throw std::runtime_error("can't find");
return x->second;
}
int main()
{
for(int user=25;user < 650;user+=25)
{
cout << user << " " << Distance(user) << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sh-4.3# g++ -o main *.cpp -std=c++11
main
sh-4.3# main
25 8.4
50 8.4
75 8.4
100 8.4
125 7.2
150 7.2
175 7.2
200 7.2
225 3.6
250 3.6
275 3.6
300 3.6
325 4.1
350 4.1
375 4.1
400 4.1
425 4.1
450 4.1
475 4.1
500 4.1
525 4.1
550 4.1
575 4.1
600 4.1
terminate called after throwing an instance of 'std::runtime_error'
what(): can't find
Aborted (core dumped)
sh-4.3# main
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |