This blog http://blog.csdn.net/livelylittlefish
Post
The author (@ Xiaoyu) takes notes on the relevant research and study content. You are welcome to correct me!
1.
Introduction
In the instance
(
Continued
3)
Based on
Print
_ Container
,
Free
_ Container
,
Find
_ Container
Templated.
2.
Modify
Print
_ Container
,
Free
_ Container
,
Find
_ Container
Function
// A template to print a container
Template
<Typename
Tag
, Typename
Multiindexcontainer
>
Void print_container (const multiindexcontainer & container)
{
// Obtain a reference to the index tagged by tag
Const
Typename
Boost: multi_index: index <multiindexcontainer
, Tag
>:: Type & indexset = get <tag
> (Container );
Typedef
Typename
Multiindexcontainer
: Value_type;
// Dump the elements of the index to cout
STD: Copy (indexset. Begin (), indexset. End (), STD: ostream_iterator (cout ));
}
3.
Code and running result
Multiindexcontainer4.cpp
/** <Br/> * boost multi index container test <br/> * platform: Win32, Visual Studio 2005/2010; Linux, gcc4.1.2 <br/> */<br/> # include <iostream> <br/> # include "Boost/multi_index_container.hpp" <br/> # include "Boost/multi_index/member. HPP "<br/> # include" Boost/multi_index/ordered_index.hpp "<br/> using namespace STD; <br/> using namespace boost: multi_index; <br/> using boost: multi_index_container; <br />// Define multiple index <br/> typedef struct myindex <br/>{< br/> int X; <br/> int y; <br/> int Z; <br/> myindex (int ax = 0, int ay = 0, int AZ = 0): X (ax), y (AY), Z (AZ) {}< br/> void print (char * prompt) const <br/>{< br/> cout <"(" <x <", "<Y <", "<z <")-"<prompt <Endl; <br/>}< br/>} myindex; <br/> // define data to be indexed <br/> typedef struct <br/>{< br/> int A; <br/> in T B; <br/>} mydata; <br/> // define object to be indexed <br/> class mytest <br/>{< br/> public: <br/> myindex; <br/> mydata; <br/> Public: <br/> mytest (int x, int y, int Z, int, int B) <br/>{< br/> myindex. X = x; <br/> myindex. y = y; <br/> myindex. z = z; <br/> mydata. A = A; <br/> mydata. B = B; <br/>}< br/> ~ Mytest () <br/>{< br/> cout <"(" <myindex. x <"," <myindex. Y <"," <myindex. z <")-"; <br/> cout <"(" <mydata. A <"," <mydata. B <"), destructed" <Endl; <br/>}< br/> void print (char * prompt) const <br/> {<br/> cout <"(" <myindex. x <"," <myindex. Y <"," <myindex. z <")-"; <br/> cout <"(" <mydata. A <"," <mydata. B <")" <prompt <Endl; <br/>}< B R/> PRIVATE: <br/> mytest (const mytest &); <br/> mytest & operator = (const mytest &); <br/> }; <br/> // define index tag, multi_index_container, and its type <br/> struct myindextag {}; <br/> typedef multi_index_container <br/> mytest *, <br/> indexed_by <br/> ordered_unique <br/> tag <myindextag>, member <mytest, myindex, & mytest :: myindex >>>< br/> mycontainer_t; <br/> typedef mycontainer_t: index <myindex Tag >:: type mycontainerindex_t; <br/> typedef mycontainer_t: index <myindextag >:: type: iterator mycontaineriterator_t; <br/> typedef STD: pair <strong, bool> mycontainerpair_t; <br/> // define operator <of index for this container <br/> bool operator <(const myindex & LHS, const myindex & RHs) <br/>{< br/> If (LHS. x <RHS. x) return true; <br/> else if (LHS. x> RHS. x) return false; <br/> else I F (LHS. Y <RHS. y) return true; <br/> else if (LHS. y> RHS. y) return false; <br/> else if (LHS. z <RHS. z) return true; <br/> else if (LHS. z> RHS. z) return false; <br/> else return false; <br/>}< br/> // define a global container <br/> mycontainer_t mycontainer; </P> <p> // a template to print a container <br/> template <typename tag, typename multiindexcontainer> <br/> void print_container (const multiindexc Ontainer & container) <br/>{< br/> // obtain a reference to the index tagged by tag <br/> const typename boost: multi_index: index <multiindexcontainer, tag >:: type & indexset = get <tag> (container); <br/> typedef typename multiindexcontainer: value_type; <br/> // dump the elements of the index to cout <br/> STD: Copy (indexset. begin (), indexset. end (), STD: ostream_iterator <value_type> (cout); <BR/>}< br/> // operator <for the template to print a containter <br/> STD: ostream & operator <(STD: ostream & OS, const mytest * mytest) <br/>{< br/> // mytest-> Print (""); // This clause can work <br/> OS <"(" <mytest-> myindex. x <"," <mytest-> myindex. Y <"," <mytest-> myindex. z <")-"; <br/> OS <"(" <mytest-> mydata. A <"," <mytest-> mydata. B <")" <Endl; <br/> return OS; <br/>} <Br/> // a template to find an element in a container <br/> template <typename tag, typename multiindexcontainer, typename index> <br/> void find_container (const multiindexcontainer & container, const index & Index) <br/>{< br/> const typename boost: multi_index :: index <multiindexcontainer, tag >:: type & indexset = get <tag> (container); <br/> const typename boost: multi_index: index <multiindexcontainer, tag >:: Type: iterator iter = indexset. find (INDEX); <br/> If (indexset. end () = ITER) <br/>{< br/> index. print ("not found"); <br/> return; <br/>}< br/> (* ITER)-> Print (", found "); <br/>}< br/> // a template to free a container <br/> template <typename multiindexcontainer> <br/> void free_container (multiindexcontainer & container) <br/>{< br/> typedef typename multiindexcontainer: value_type; <br/> While (! Container. empty () <br/>{< br/> typename multiindexcontainer: iterator iter = container. begin (); <br/> If (null = (* ITER) <br/>{< br/> container. erase (ITER); <br/> continue; <br/>}< br/> value_type pobj = * ITER; <br/> container. erase (ITER); <br/> Delete pobj; <br/>}< br/> void test1 () <br/>{< br/> mytest * A = new mytest (1, 1, 10, 100); <br/> mycontainer. insert (a); <br/> mytest * B = new mytest (200,); <br/> mycontainer. insert (B); <br/> mytest * c = new mytest (1, 1, 3, 30, 300); <br/> mycontainer. insert (c); <br/>}< br/> void Test2 () <br/>{< br/> mytest * A = new mytest, 400); <br/> mycontainer. insert (a); <br/> mytest * B = new mytest (1, 2, 50, 500); <br/> mycontainer. insert (B); <br/> mytest * c = new mytest (1, 2, 3, 60, 600); <br/> mycontainer. insert (c); <br/>}< br/> void test3 () <br/>{< br/> mytest * A = new mytest, 700); <br/> mycontainer. insert (a); <br/> mytest * B = new mytest (1, 3, 2, 80, 800); <br/> mycontainer. insert (B); <br/> mytest * c = new mytest (1, 3, 90, 900); <br/> mycontainer. insert (c); <br/>}< br/> void test4 () <br/>{< br/> mytest * A = new mytest (1,110,100, 0 ); <br/> mycontainer. insert (a); <br/> mytest * B = new mytest (2,220,200, 0); <br/> mycontainer. insert (B); <br/> mytest * c = new mytest (3,330,300, 0); <br/> mycontainer. insert (c); <br/>}< br/> void test5 () <br/>{< br/> mytest * A = new mytest (1,440,400, 0 ); <br/> mycontainer. insert (a); <br/> mytest * B = new mytest (2,550,500, 0); <br/> mycontainer. insert (B); <br/> mytest * c = new mytest (3,660,600, 0); <br/> mycontainer. insert (c); <br/>}< br/> void test6 () <br/>{< br/> mytest * A = new mytest (1,770,700, 0 ); <br/> mycontainer. insert (a); <br/> mytest * B = new mytest (2,880,800, 0); <br/> mycontainer. insert (B); <br/> mytest * c = new mytest (3,990,900, 0); <br/> mycontainer. insert (c); <br/>}< br/> void test_find () <br/>{< br/> find_container <myindextag> (mycontainer, myindex (1,1, 1); <br/> find_container <myindextag> (mycontainer, myindex (, 2); <br/> find_container <myindextag> (mycontainer, myindex, 3); <br/> find_container <myindextag> (mycontainer, myindex (1, 2); <br/> find_container <myindextag> (mycontainer, myindex (1, 2, 2); <br/> find_container <myindextag> (mycontainer, myindex (, 3); <br/> find_container <myindextag> (mycontainer, myindex, 1); <br/> find_container <myindextag> (mycontainer, myindex (, 2); <br/> find_container <myindextag> (mycontainer, myindex, 3); <br/> find_container <myindextag> (mycontainer, myindex (, 1); <br/> find_container <myindextag> (mycontainer, myindex, 2); <br/> find_container <myindextag> (mycontainer, myindex (, 3); <br/> find_container <myindextag> (mycontainer, myindex, 1); <br/> find_container <myindextag> (mycontainer, myindex (, 2); <br/> find_container <myindextag> (mycontainer, myindex, 3); <br/> find_container <myindextag> (mycontainer, myindex (2, 3, 1); <br/> find_container <myindextag> (mycontainer, myindex (2, 3, 2); <br/> find_container <myindextag> (mycontainer, myindex (2, 3); <br/>}< br/> int main () <br/>{< br/> Test2 (); <br/> test4 (); <br/> test6 (); <br/> test1 (); <br/> test3 (); <br/> test5 (); <br/> print_container <myindextag> (mycontainer); <br/> cout <Endl; <br/> test_find (); <br/> cout <Endl; <br/> free_container (mycontainer); <br/> return 0; <br/>}
The running result is as follows:
(1, 1, 1)-(10,100)
(1, 1, 2)-(20,200)
(1, 1, 3)-(30,300)
(1, 2, 1)-(40,400)
(1, 2, 2)-(50,500)
(1, 2, 3)-(60,600)
(1, 3, 1)-(70,700)
(1, 3, 2)-(80,800)
(1, 3, 3)-(90,900)
(2, 1, 1)-(110,100 0)
(2, 1, 2)-(220,200 0)
(2, 1, 3)-(330,300 0)
(2, 2, 1)-(440,400 0)
(2, 2, 2)-(550,500 0)
(2, 2, 3)-(660,600 0)
(2, 3, 1)-(770,700 0)
(2, 3, 2)-(880,800 0)
(2, 3, 3)-(990,900 0)
(1, 1, 1)-(10,100), found
(1, 1, 2)-(20,200), found
(1, 1, 3)-(30,300), found
(1, 2, 1)-(40,400), found
(1, 2, 2)-(50,500), found
(1, 2, 3)-(60,600), found
(1, 3, 1)-(70,700), found
(1, 3, 2)-(80,800), found
(1, 3, 3)-(90,900), found
(2, 1, 1)-(0, 110,100), found
(2, 1, 2)-(0, 220,200), found
(2, 1, 3)-(0, 330,300), found
(2, 2, 1)-(0, 440,400), found
(2, 2, 2)-(0, 550,500), found
(2, 2, 3)-(0, 660,600), found
(2, 3, 1)-(0, 770,700), found
(2, 3, 2)-(0, 880,800), found
(2, 3, 3)-(0, 990,900), found
(1, 1, 1)-(10,100), destructed
(1, 1, 2)-(20,200), destructed
(1, 1, 3)-(30,300), destructed
(1, 2, 1)-(40,400), destructed
(1, 2, 2)-(50,500), destructed
(1, 2, 3)-(60,600), destructed
(1, 3, 1)-(70,700), destructed
(1, 3, 2)-(80,800), destructed
(1, 3, 3)-(90,900), destructed
(2, 1, 1)-(110,100 0), destructed
(2, 1, 2)-(0, 220,200), destructed
(2, 1, 3)-(0, 330,300), destructed
(2, 2, 1)-(0, 440,400), destructed
(2, 2, 2)-(0, 550,500), destructed
(2, 2, 3)-(0, 660,600), destructed
(2, 3, 1)-(770,700 0), destructed
(2, 3, 2)-(0, 880,800), destructed
(2, 3, 3)-(0, 990,900), destructed
Technorati label: boost
, Multi_index
, Multi_index_container