multi_index_container
multi_index_container
所以我有一个具有多个非唯一索引的boost::multi_index_container
。我想找到一种优雅的方法来执行关系数据库样式的查询,以查找使用多个索引匹配一组标准的所有元素。
例如,给定设备之间的连接列表,我想搜索源为'server'且目的地为'pc2'的所有元素。我有一个索引在源和一个索引在Dest。
Source Dest/Port
---- ---------
server pc1 23
server pc1 27
server pc1 80
server pc2 80 <- want to find these two
server pc2 90 <-
printer pc3 110
printer pc1 110
scanner mac 8080
通常,我可能会在第一个索引上执行lower_bound
和upper_bound
(以匹配'server'),然后在这些迭代器之间进行线性搜索,以找到在"Dest"列中匹配的元素,但这不是很令人满意,因为我有第二个索引。是否有一种类似于stl/boost的优雅方法来利用存在两个索引的事实并避免线性搜索(或等量的工作,例如将所有中间结果添加到另一个容器中,等等)?
(显然,在这个例子中,线性搜索是最快的,但如果有10000个条目以'server'作为源,那么使用第二个索引将开始变得更好。)
任何想法都是赞赏的!
您可能只是从关系数据库中获得一些灵感…
…但是首先我们需要揭开索引的神秘面纱。
<<p> 复合索引/strong>关系数据库中有两种类型的索引:
- 常规索引:单列索引
- 复合索引:一次在多个列上索引
两者给出不同的性能结果。当您需要使用两个索引时,有一个合并通道来组合它们给出的结果(也称为连接),因此复合索引可以提供速度提升。
多索引
Boost多索引可以使用复合索引,毕竟您可以自由地提供自己的哈希或比较函数。
与关系数据库的一个关键区别是,您不能有一个有效的合并通道(合并两个ROWID集),因为这需要内在的知识才能有效,因此您确实被第一次搜索结果中的线性搜索所困住了。这取决于你找到最具鉴别力的第一个搜索。
注意:multi-index这个名字是指当你插入、更新和删除元素时,它会自动维护多个索引的想法。这还意味着您可以使用这些索引中的任何一个来搜索您所决定的性能配置文件。但它并不是一个具有统计、启发式和查询引擎的成熟的数据库引擎。
执行关系数据库样式查询的最优雅的方法是使用关系数据库。我不是轻率;你使用了错误的数据结构。如果"关系数据库风格的查询"操作是你经常要做的事情,我强烈建议你投资SQLite。
Boost的目的。MultiIndex不是一个又快又脏的数据库。
- 在提升multi_index容器中,是否定义了"default index"?
- DrawIndexedInstanced 具有不同的 Index Count per Instance (Directx
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- OpenGL VBO Indexing ( How to compute Index Array)
- "Warning: Comma within array index expression"但逗号分隔函数参数
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 如何根据排序索引的向量对 std::index 集进行排序?
- 在一行代码中理解 index++
- C++ "oldstyle container ":指针/数组/新 - 可能误会?
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么打印 c 样式字符串的'address of index n'会导致子字符串的输出
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 使用 std::get 访问 std::variant<index>
- 代码中的"vector<<int>vector>&index"是什么意思?
- 为什么std::{container}::template不能推导其参数类型
- CStringArray::GetAt(int index) 返回一个 const. 为什么?
- 如何配置 Doxygen 以在"Class Index"中包含类的类型定义?
- boost::container::vector 无法用谷物序列化?
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 模板化函数以从输入参数推断返回类型 stl-container