Boost.Intrusive

  • 伝統的なリンクリストの構造体をContainer風に操作できる
  • 伝統的なリンクリストはノードポインタを要素に埋め込むことでメモリアクセスの負担を軽くする
  • CPUにとってアクセスが容易なメモリの塊(std::vectorなど)を利用してリンク構造を提供できる
  • Boost.PtrContainerと違ってownershipに関与しない


[]#include[][] <iostream>[]
[]#include[][] <vector>[]
[]#include[][] <boost/intrusive/ilist.hpp>[]
[]#include[][] <boost/range.hpp>[]

[]typedef[] []struct[] []ENEMY[] {
[]struct[] []ENEMY[] *[]prev[];
[]struct[] []ENEMY[] *[]next[];
[]int[] []x[], []y[];
} []ENEMY[];


[]typedef[] []boost[]::[]intrusive[]::[]ilist[]<
[]boost[]::[]intrusive[]::[]member[]<[]ENEMY[], &[]ENEMY[]::[]prev[], &[]ENEMY[]::[]next[]>
> []ENEMY_list_t[];

[]int[] []main[]([]int[] []argc[], []char[] *[]argv[][])
{
[]typedef[] []std[]::[]vector[]<[]ENEMY[]> []enemy_container_t[];
[]enemy_container_t[] []enemies[](100);
{
[]ENEMY_list_t[]::[]init_node[]([]enemies[][0]); []enemies[][0].[]x[] = 5; []enemies[][0].[]y[] = 10;
[]ENEMY_list_t[]::[]init_node[]([]enemies[][1]); []enemies[][1].[]x[] = 6; []enemies[][1].[]y[] = 12;
[]ENEMY_list_t[]::[]init_node[]([]enemies[][2]); []enemies[][2].[]x[] = 7; []enemies[][2].[]y[] = 14;
[]// ...[]
}

[]ENEMY_list_t[] []stage1_enemies[];
[]for[] ([]boost[]::[]range_size[]<[]enemy_container_t[]>::[]type[] []i[] = 0; []i[] < 3; ++[]i[])
[]stage1_enemies[].[]push_back[]([]enemies[][[]i[]]);

[]for[] ([]boost[]::[]range_const_iterator[]<[]ENEMY_list_t[]>::[]type[]
[]it[] = []boost[]::[]const_begin[]([]stage1_enemies[]), []last[] = []boost[]::[]const_end[]([]stage1_enemies[]);
[]it[] != []last[]; ++[]it[])
{
[]std[]::[]cout[] << []it[]->[]x[] << []","[] << []it[]->[]y[] << []std[]::[]endl[];
}

[]std[]::[]cin[].[]get[]();
[]return[] 0;
}