试试下面的办法
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <iterator>
int main()
{
std::map<std::string, int> test;
test["auto works"] = 1;
test["before word"] = 2;
test["before list"] = 3;
test["before pattern"] = 4;
test["before me"] = 5;
test["before hen"] = 6;
test["has float"] = 7;
std::string s("before me grep lot");
auto it = test.lower_bound(s);
size_t prev = 0, next = 0;
if (it != test.begin())
{
auto pos = std::mismatch(s.begin(), s.end(),
std::prev(it)->first.begin(), std::prev(it)->first.end());
prev = std::distance(s.begin(), pos.first);
}
if (it != test.end())
{
auto pos = std::mismatch(s.begin(), s.end(),
it->first.begin(), it->first.end());
prev = std::distance(s.begin(), pos.first);
}
std::string target = prev < next ? it->first : std::prev(it)->first;
std::cout << "The closest item is test[\"" << target << "\"] = " << test[target] << std::endl;
}
程序输出是
The closest item is test["before me"] = 5
如果你的编译器的标准库不支持算法的std ::有四个参数不匹配,则if语句可以看起来像
if (it != test.begin())
{
std::cout << std::prev(it)->first << std::endl;
std::string::size_type n = std::min(s.size(), std::prev(it)->first.size());
auto pos = std::mismatch(s.begin(), std::next(s.begin(), n),
std::prev(it)->first.begin());
prev = std::distance(s.begin(), pos.first);
}
if (it != test.end())
{
std::cout << it->first << std::endl;
std::string::size_type n = std::min(s.size(), std::prev(it)->first.size());
auto pos = std::mismatch(s.begin(), std::next(s.begin(), n),
it->first.begin());
prev = std::distance(s.begin(), pos.first);
}
为什么'5'是“更好的匹配”? –
是否要返回*全部*以搜索字符串开头的键? – Galik