C++ 映射中最近的字符串/时间戳

C++ 映射中最近的字符串/时间戳,c++,C++,如果时间戳不在使用时间戳存储的映射中,我希望在映射中找到最接近的匹配时间戳,并使用最接近的值作为键。我有我要做的基本结构设置,只是不知道如何找到最近的时间戳 typedef std::map<std::string,int> Map; Map::iterator it; Map my_map; my_map["2010-01-26 17:02:12"]= 1; my_map["2010-01-25 08:55:29"]= 2; my_map["2010-01-24 08:55:2

如果时间戳不在使用时间戳存储的映射中,我希望在映射中找到最接近的匹配时间戳,并使用最接近的值作为键。我有我要做的基本结构设置,只是不知道如何找到最近的时间戳

typedef std::map<std::string,int>  Map;
Map::iterator it;
Map my_map;

my_map["2010-01-26 17:02:12"]= 1;
my_map["2010-01-25 08:55:29"]= 2;
my_map["2010-01-24 08:55:29"]= 3;

string timestamp = "2010-01-24 08:55:30"; // would return 3
string timestamp1 = "2010-01-27 01:55:30"; // would return 1

  it = my_map.find(timestamp); 
     if(it == my_map.end()){
       //not sure how to approach this
   }    
更新

我试图避免将相当大的代码库从std::string转换为uint64_t,虽然这会提高性能,但问题并不大

我无法使std::map::lower\u bound或std::map::upper\u bound解决方案正常工作 这是我在IDE 1上的尝试


我相信有上界函数和下界函数,你可以用它们来查找上面和下面的邻居。

你可能可以用or得到你需要的东西,这两个函数中的任何一个都很复杂


还强烈地考虑将时间戳存储为UnT64 64而不是字符串。这将大大减少比较和处理的计算量。

第一件事-不要将时间戳存储为字符串。你只是在给自己设置一个充满伤害的世界。一旦通过切换到整数类型修复了这个问题,就可以尝试使用std::lower_bound。别忘了检查结果上方的元素,看它是否更接近。在这个方向上进行研究,然后带着任何问题回来。映射的正向迭代器的反引用是否会计算为比较时使用的值类型?@Abhijit:啊,很好。我们需要这些函数的映射版本。@OliCharlesworth我知道uint64\u t可能更有效,但我正试图避免这种情况,因为它会涉及大量重写,std::map::lower_bound或std::map::upper_bound与std::string不起作用这是我的尝试,所以我想我别无选择,只能重写代码?@pyCthon:2对我来说似乎是正确的答案;例如,lower_bound的定义是不小于输入参数的第一个元素。如果要查找最近的元素,则需要将此元素与上一个元素进行比较。但是最困难的工作是首先找到这个元素。这两个bsearch函数都需要取消引用映射的fwd迭代器,以便与键进行比较。在本例中,键通常是string,或者建议使用uint64\t。取消引用fwd迭代器我认为应该返回一个对,并且永远不会与值进行比较,除非您将std::pair传递到上界,但这需要比较函数。不,我不这么认为,尽管我不完全清楚您的意思。请注意,类映射中既有free函数,也有memberfunction。后者采用与“再次查找”类似的键,即memberfunction,而不是free!。事实上,我还是搞砸了:你只需要给其中一个打电话,而不是两个都打。您可以通过简单地递减上限来确定另一个。然后,您只需要比较该值是否相等。这里的挑战不是取消对结束迭代器的引用,也不是将迭代器递减到开始,而是在处理STL样式的容器代码时,这是正常的。