我正在寻找一些STL、boost或类似的容器,以便使用与在数据库中使用索引的方式相同的方式,使用如下查询来搜索记录:
select * from table1 where field1 starting with 'X';或
select * from table1 where field1 like 'X%';我考虑过使用std::map,但我不能,因为我需要搜索“以”一些文本开头的字段,而不是那些“等于”的字段。除此之外,我需要它在多个字段上工作(例如,每个“记录”都有6个字段),所以我需要为每个字段单独创建一个std::map。
我可以创建一个排序向量或列表,并使用二进制搜索(通过读取中间的元素并查看它是大于还是小于‘X’,在每一步中将集合分成2个),但我想知道是否有一些现成的容器可以使用,而无需重新发明轮子?
发布于 2010-04-22 19:17:24
Boost.Multi-Index允许您使用多个索引进行管理,并且它实现了与std::lower_bound /map相同的设置。您需要选择与该字段对应的索引,然后将其视为映射或集合。
Next跟随一个通用函数,该函数可用于获取两个迭代器,第一个迭代程序以给定的前缀开始,第二个迭代程序以下一个前缀开始,即搜索结束
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)
发布于 2010-04-22 18:40:11
如果除了字符串之外没有其他数据,则使用std::map;如果没有其他数据,则使用std::set。将您的前缀字符串传递给lower_bound,以获得在该点或之后排序的第一个字符串。然后向前迭代map,直到到达末尾,或者找到一个不是以您的前缀开头的元素。
https://stackoverflow.com/questions/2689963
复制相似问题