string内部的find函数本身可以实现对任意子串的查找,也就实现了模糊查找。问题在于必须给map的first准确的关键字,否则会查不出来,这就需要对find_if函数的谓词函数进行改造。
template<class InIt, class Pred>
InIt find_if(InIt first, InIt last, Pred pr);
返回区间 [first,last) 中的迭代器 i, 使得 pr(*i) == true
为此,我构造了一个类,并重载了函数调用运算符,在其内部实现取子串查找。(STL中常常这样构造类)
class map_value_finder
{
public:
map_value_finder(const string& cmp_string) :m_s_cmp_string(cmp_string) {}
bool operator ()(const multimap<string,int>::value_type& pair)
{
int loc;
loc=pair.first.find(m_s_cmp_string);
if (loc != pair.first.npos)
return true;
return false;
}
private:
const string& m_s_cmp_string;
};
void Operation::fuzzyFindBname(string str)
{
multimap<string, int>::iterator it, p1, p2, p, begin;
p1 = bookname.begin();//bookname是存有书名的map
p2 = bookname.end();
begin = p1;
for (p = p1; p != p2; p++)
{
it = find_if(begin, bookname.end(), map_value_finder(str));
if (it == bookname.end())
return;
else
cout << book[it->second] << endl;//book是存放所有书籍的vector
it++;
begin = it;
}
}