我有一个地图测试,并初始化到下面
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;
我有一个字符串搜索,初始化为“在我grep lot之前”。
现在我想在测试图中找到搜索字符串。理想情况下,我希望在测试图中找到一个更好的匹配搜索字符串“before me grep lot”。
输出应为5。
请帮帮我。
答案 0 :(得分:1)
使用test.lower_bound(search)
(documentation)。
答案 1 :(得分:1)
尝试以下方法
#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 :: mismatch,那么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 );
}