Giriş
Şu satırı dahil ederiz.
Tag + identity
Şu satırı dahil ederiz.
Açıklaması şöyle. Yani iterator ile nesneyi değiştirmemeli. Container nesnesinin update metodları kullanılmalı.
Aynı bir std::unordered_map iterator gibi çalışır. Şöyle yaparız.
Şu satırı dahil ederiz.
#include <boost/multi_index/hashed_index.hpp>
std::unordered_map gibidir. Şu satırı dahil ederiz.
Şu satırı dahil ederiz.
Şu satırı dahil ederiz.
Ş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#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;
Ş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;
iteratorAçıklaması şöyle. Yani iterator ile nesneyi değiştirmemeli. Container nesnesinin update metodları kullanılmalı.
find metoduThe 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.
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