1

此代码取自 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;
}
4

1 回答 1

2

// 我的返回类型是什么?

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 这样的 [] 运算符

不能说为什么,就是没有

于 2012-05-30T08:35:43.297 回答