增强对哈希唯一索引的多索引访问
boost multi index access to hashed unique index
这段代码是从boost多索引"mru"的例子中采用的:
http://www.boost.org/doc/libs/1_46_1/libs/multi_index/example/serialization.cpp
我的代码正在执行类似于 boost::unordered_map 的操作,但我真的很想从此示例中添加 mru 功能。
我想使这段代码尽可能接近 boost::unordered_map。对我来说,关键功能是unordered_map的 [] 运算符。
main() 的最后一行被打破,每行上方作为注释是我的问题。
提前感谢所有回答评论。
#include <algorithm>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <iostream>
using namespace boost::multi_index;
class my_struct {
public:
my_struct(int in_a, std::string in_b) : a(in_a), b(in_b) {}
int a;
std::string b;
bool operator==(const my_struct &rhs) const
{
return (a == rhs.a);
}
bool operator!=(const my_struct &rhs) const
{
return !(*this == rhs);
}
friend std::ostream& operator<<(std::ostream &out, const my_struct&ms);
};
std::ostream& operator<<(std::ostream &out, my_struct &ms)
{
out << ms.a << " " << ms.b << std::endl;
return out;
}
inline std::size_t
hash_value(const my_struct &val)
{
return boost::hash_value(val.a);
}
// tags for multi_index
struct umap {};
template <typename Item>
class mru_list
{
typedef multi_index_container<
Item,
indexed_by<
sequenced<>,
hashed_unique<boost::multi_index::tag<umap>, identity<Item> >
>
> item_list;
public:
typedef Item item_type;
typedef typename item_list::iterator iterator;
mru_list(std::size_t max_num_items_):max_num_items(max_num_items_){}
void insert(const item_type& item)
{
std::pair<iterator,bool> p=il.push_front(item);
if(!p.second){ /* duplicate item */
il.relocate(il.begin(),p.first); /* put in front */
}
else if(il.size()>max_num_items){ /* keep the length <= max_num_items */
il.pop_back();
}
}
iterator begin(){return il.begin();}
iterator end(){return il.end();}
//private:
item_list il;
std::size_t max_num_items;
};
int main()
{
mru_list<my_struct> mru(10);
my_struct one(1, "One");
mru.insert(one);
mru.insert(my_struct(2, "Two"));
mru.insert(my_struct(3, "Three"));
mru.insert(one);
std::cout<<"most recently entered terms:"<<std::endl;
for (mru_list<my_struct>::iterator itr = mru.begin(); itr != mru.end(); ++itr) {
std::cout << itr->a << std::endl;
}
// what is my return type?
mru.il.get<umap>();
// Why doesn't this work?
mru_list<my_struct>::iterator itr = mru.il.get<umap>().find(one);
// Why doesn't this have a [] operator like boost:unordered_map
mru.il.get<umap>()[1] = "foobar";
return 0;
}
我的返回类型是什么?
mru.il.get<umap>();
其返回类型是umap
索引的类型,即:
typedef typename boost::multi_index::index<
item_list
, umap
>::type hashed_index_t;
mru_list<my_struct>::hashed_index_t& hashed_index = mru.il.get<umap>();
在 C++11 中,使用 auto
更容易
auto& hashed_index = mru.il.get<umap>();
为什么这不起作用?
mru_list<my_struct>::iterator itr = mru.il.get<umap>().find(one);
find()
返回umap
(第二个)索引的迭代器,上面的语句将其分配给第一个索引的迭代器。有一些投影操作可以从同一多索引容器的一种索引迭代器类型转换为另一种迭代器类型,例如:
mru_list<my_struct>::iterator itr = project<0>(mru.il, hashed_index.find(one));
为什么这没有像 boost:unordered_map 这样的 [] 运算符
说不出为什么,就是没有。
相关文章:
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- 如何通过索引访问枚举类
- 通过索引访问 rapidjson::D ocument array
- 可以使用整数索引访问向量元素吗?
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 如何使用索引访问C 结构属性值
- 字符串中消失的字符,但使用索引访问
- 是否可以使用 1D 索引访问 C++ 2D int 数组
- 提升图形库:获取edge_descriptor或通过 int 类型的索引访问边缘
- 在运行时按索引访问 std::tuple 元素的最佳方法
- 使用枚举作为索引访问 2D 向量
- 通过索引访问矢量的速度:向后与向前
- 是否可以使用负索引访问二维数组
- C++中基于类矩阵结构的索引访问
- 直接索引访问与"high"内存使用量相比的理论影响是什么? "shifted"使用"low"内存使用情况的索引访问?
- 增强对哈希唯一索引的多索引访问
- C++ STL 向量迭代器与索引访问和线程安全
- 如何通过索引访问 boost::multi_index::multi_index_container<> 的所有元素?
- 向量索引访问与迭代器访问的效率
- 具有唯一元素和按索引访问的容器