28 Ekim 2016 Cuma

multi_index hashed_unique Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/multi_index/hashed_index.hpp>
std::unordered_map gibidir. Şu satırı dahil ederiz.
namespace bi = boost::multi_index;
Tag + const_mem_fun - Üye Metod
Şu satırı dahil ederiz.
#include <boost/multi_index/key_extractors.hpp>
Şöyle yaparız.
boost::multi_index_container<
  Foo,
  bi::indexed_by<
    bi::hashed_unique<
      bi::tag<IndexByUniqueId>,
      bi::const_mem_fun<Foo, const std::string, &Foo::getName> 
    >
  >
> container;
mem_fun - Üye Metod
Şu satırı dahil ederiz.
#include <boost/multi_index/key_extractors.hpp>
Şöyle yaparız.
boost::multi_index_container<
  Foo,
  bi::indexed_by<    
    bi::hashed_unique<bi::mem_fun<Foo, std::string, &Foo::getName> >,
    bi::hashed_unique<bi::mem_fun<Foo, int, &Foo::getAge> >  > 
>;
Tag + member - Üye Alan
Şu satırı dahil ederiz.
#include <boost/multi_index/key_extractors.hpp>
veya şu satırı dahil ederiz.
#include <boost/multi_index/member.hpp>
Elimizde şöyle bir yapı olsun.
struct X
{
  long long l; // assume unique
  int i1; // assume unique
  int i2; // assume non-unique
  // plus any ohter data you have in your class X
};
Index'ler için tag'ler tanımlarız.
struct IndexByL {};
struct IndexByI1 {};
struct IndexByI2 {};
Şöyle yaparız.
using Container = boost::multi_index_container<
  X*, // the data type stored
  bi::indexed_by< // list of indexes
    bi::hashed_unique<  //hashed index over 'l'
      bi::tag<IndexByL>, // give that index a name
      bi::member<X, long long, &X::l> //index's key
    >,
    ...
  >
> container;
Composite Key İle Tanımlama
Şu satırı dahil ederiz.
#include <boost/multi_index/key_extractors.hpp>
veya şu satırları dahil ederiz.
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/composite_key.hpp>
Şöyle yaparız.
boost::multi_index_container<
  MyClass,
  bi::indexed_by<
    bi::hashed_unique< bi::tag<struct hash> ,
      bi::composite_key< 
        MyClass,
        bi::const_mem_fun<MyClass,int,&MyClass::get_int >,
        bi::const_mem_fun<MyClass,const std::vector<int>&,&MyClass::get_vec >
      >
    >,
    ...
  >
> container;
Tag + identity
Şu satırı dahil ederiz.
#include <boost/multi_index/key_extractors.hpp>
veya su satırı dahil ederiz.
#include <boost/multi_index/identity.hpp>
Şöyle yaparız. Pointer için kullanılabilir.
typedef std::shared_ptr<Foo> FooPtr;

boost::multi_index_container<
  FooPtr,
  bi::indexed_by<
    bi::hashed_unique<
      bi::tag<struct ByPtr>
      bi::identity<FooPtr> 
    >
  >
> container;
iterator
Açıklaması şöyle. Yani iterator ile nesneyi değiştirmemeli. Container nesnesinin update metodları kullanılmalı.
The iterators provided by every index are constant, that is, the elements they point to cannot be mutated directly. This follows the interface of std::set for ordered indices but might come as a surprise for other types such as sequenced indices, which are modeled after std::list, where this limitation does not happen. This seemingly odd behavior is imposed by the way multi_index_containers work; if elements were allowed to be mutated indiscriminately, we could introduce inconsistencies in the ordered indices of the multi_index_container without the container being notified about it. Element modification is properly done by means of update operations on any index.
find metodu
Aynı bir std::unordered_map iterator gibi çalışır. Şöyle yaparız.
Foo foo = ..;
auto iterator = container.get<MyTag>().find (foo);
if (iterator != container.get<MyTag>().end())
  found(*iterator);
else
  notFound();
insert metodu
C++11 kullanmıyorsak indeksler için typedef yapmak iyi bir fikir.
typedef bi::index<my_list, hash>::type hashed_index;
Aşağıdaki kodda C++11 kullandığım için auto kelimesi ile iş kolayca halloluyor. Şöyle yaparız.
Container c;  // empty container
X x1{...};

// Insert some elements
auto& indexByL = c.get<IndexByL>();
indexByL.insert (&x1);


Hiç yorum yok:

Yorum Gönder