增强对哈希唯一索引的多索引访问

boost multi index access to hashed unique index

本文关键字:索引 访问 唯一 哈希 增强      更新时间:2023-10-16

这段代码是从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 这样的 [] 运算符

说不出为什么,就是没有。