对不起,如果我误解了,但是如果您可以使用查询字符串的“子字符串视图”来搜索多图而不是普通std::string
对象,您的问题会得到解决吗?
在这种情况下,以下几行将起作用(使用基于 C++11 的编码):
定义子字符串视图对象类型。它由字符串和(从,到)偏移量构成,但不复制子字符串:
class substrview
{
std::string::const_iterator _from;
std::string::const_iterator _to;
public:
substrview(
const std::string &s,
const std::size_t from,
const std::size_t to)
: _from(s.begin()+from), _to(s.begin()+to)
{ }
std::string::const_iterator begin() const
{ return _from; }
std::string::const_iterator end() const
{ return _to; }
};
为了使用子字符串视图搜索多地图,我建议使用std::lower_bound
和std::upper_bound
方法<algorithm>
:
int main()
{
std::multimap<std::string,int> map {
{ "hello" , 1 },
{ "world" , 2 },
{ "foo" , 3 },
{ "foobar" , 4 },
{ "foo" , 5 },
};
std::string query { "barfoo" };
/* Search for all suffixes of "barfoo", one after the other: */
for (std::size_t i = 0 ; i < query.size() ; ++i) {
substrview subquery { query,i,query.size() };
auto found_from = std::lower_bound(begin(map),end(map),subquery,cmpL);
auto found_to = std::upper_bound(begin(map),end(map),subquery,cmpU);
/* Now [found_from,found_to) is the match range in the multi-map.
Printing the matches: */
while (found_from != found_to) {
std::cout << found_from->first << ", " << found_from->second << '\n';
++found_from;
}
}
}
为此,我们只需要定义比较运算符cmpL
和cmpU
(一个 for lower_bound
,另一个 for upper_bound
- 我们需要两个,因为比较是不对称的:将 multi-map 条目与substringview
incmpL
进行比较,并将 asubstringview
与 multi-map 条目进行比较在cmpU
):
inline bool cmpL(
const std::pair<std::string,int> &entry,
const substrview &val)
{
return std::lexicographical_compare
(entry.first.begin(),entry.first.end(),val.begin(),val.end());
}
inline bool cmpU(
const substrview &val,
const std::pair<std::string,int> &entry)
{
return std::lexicographical_compare
(val.begin(),val.end(),entry.first.begin(),entry.first.end());
}
完整代码的工作要点:https ://gist.github.com/4070189