我正在寻找一些STL,boost或类似容器,使用与数据库中使用索引相同的方式,使用如下查询搜索记录:
select * from table1 where field1 starting with 'X';
或
select * from table1 where field1 like 'X%';
我考虑过使用std :: map,但我不能,因为我需要搜索“以某些文本开头”的字段,而不是那些“等于”的字段。除此之外,我需要它在多个字段上工作(例如,每个“记录”有6个字段),所以我需要为每个字段分别使用一个std :: map。
我可以创建一个有序矢量或列表并使用二进制搜索(通过读取中间的元素并查看它是否多于或小于'X',在每个步骤中打破2中的集合),但我想知道是否有我可以使用一些现成的容器而不需要重新发明轮子?
答案 0 :(得分:10)
Boost.Multi-Index允许您使用多个索引进行管理,并且它实现了对std :: set / map的lower_bound。您需要选择与该字段对应的索引,然后执行该操作,就像它是地图或集合一样。
接下来是一个通用函数,可用于获取几个迭代器,第一个项目以给定前缀开头,第二个项目以下一个前缀开头,即搜索结束
template <typename SortedAssociateveContainer>
std::pair<typename SortedAssociateveContainer::iterator,
typename SortedAssociateveContainer::iterator>
starts_with(
SortedAssociateveContainer const& coll,
typename SortedAssociateveContainer::key_type const& k)
{
return make_pair(coll.lower_bound(k),
coll.lower_bound(next_prefix(k));
}
,其中
starts_with
的结果可用于任何范围算法(请参阅Boost.Range)
答案 1 :(得分:5)
std::map
没问题,如果除了字符串之外没有其他数据,则为std::set
。将前缀字符串传递给lower_bound
以获取在该点或之后排序的第一个字符串。然后在地图中向前迭代,直到结束或找到不以前缀开头的元素。