【发布时间】:2014-03-03 16:56:19
【问题描述】:
我需要一个能够快速搜索超过 100 万个项目并保持插入顺序的容器。
所以我首先想到了 std::map 但它并不关心插入顺序,它根据键对数据进行排序。 我发现 boost::multi_index 应该保留插入顺序并通过索引字段(在我的情况下是 id (not unique!))快速搜索数据。所以我做了这样的事情:
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 计算机。
【问题讨论】:
标签: c++ search boost containers boost-multi-index