c++ - 通过索引快速搜索并保持 C++ 中的插入顺序

标签 c++ search boost containers boost-multi-index

我需要一个能够快速搜索超过 100 万个项目并保持插入顺序的容器。

所以首先我想到了 std::map 但它不关心插入顺序它根据键对数据进行排序。 我发现 boost::multi_index 将保留插入顺序并通过索引字段快速搜索数据(对于我的情况是 id(不是唯一的!))。所以我做了类似的事情:

struct myData
{
    unsigned long id;
    unsigned long insertionOrder;

    myData (){};
    myData (unsigned long id_,unsigned long insertionOrder_):id(id_), insertionOrder(insertionOrder _)){}
    ~ myData (){};
};


typedef multi_index_container<
    myData, 
        indexed_by<    
            random_access<>,  // keep insertion order
            ordered_non_unique< member< myData, unsigned long, & myData::id> >
        > 
> myDataContainerType;

我可以毫无问题地将数据推送到容器中。假设我向容器中插入 5 个项目,例如:

myDataContainer.push_back(myData(1002, 1));
myDataContainer.push_back(myData(1001, 2));
myDataContainer.push_back(myData(1005, 3));
myDataContainer.push_back(myData(1003, 4));
myDataContainer.push_back(myData(1000, 5));

问题是当我在我的容器中搜索项目 “1001” 时,iterator++ 返回 "1002" 并且 iterator— 返回 "1000"。所以看起来它并不关心插入顺序,而是根据索引值对数据进行排序。

我期望 iterator++ 的结果:“1002”iterator-- 的结果:“1005” .我的意思是根据插入顺序的数据。

我做错了吗?我怎样才能实现像通过索引值进行快速搜索并根据插入顺序检索数据这样的事情。

我正在使用 Visual Studio 2008、Visual C++、Win 7 x64 计算机。

最佳答案

您的boost::multi_index 尝试就快完成了。问题是,当您使用有序索引进行查找时,迭代被排序。幸运的是,多索引提供了一个 project 机制来在索引之间切换。如果我正确阅读文档:

auto ordered_iter = myMap.find(1001);
auto iter = boost::multi_index::project<0>(ordered_iter);

关于c++ - 通过索引快速搜索并保持 C++ 中的插入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21608112/

相关文章:

jquery - 找到一个刚刚由 jQuery 添加的数据属性

搜索中的 Drupal 7 索引 pdf 文件

python - 如果我需要查找一个值或下一个最高值,我应该使用什么搜索算法?

c++ - Spirit 无法将属性分配给单元素结构(或 fusion 序列)

C++ 通用 Windows 应用程序仅在安装驱动器上的 VS2015 项目时有效

c++ - 在 Unix 上安装库的多个拷贝

c++ - 使用 boost 库工具/root 编译时出错

c++ - 使用抽象指针调用派生类函数

c++ - boost ptr_vector 处理删除 "by reference"

c++ - boost::lexical_cast 输出错误