これらのコメントを外すと
//BaseList baselist;
//MemberList memberlist;
ループの外側で、クラッシュするループの内側のものをコメントアウトします。ベースリスト (およびメンバーリスト) をループの外に置くことができる必要があります。これはどのように達成されますか?
編集
私が最も単純な形で解決しようとしている実際の問題はこれです。
の std::vector が
MyClass
必要です。これを AllThingsBunchedTogether と呼びます。の std::vector も必要ですBaseList
。これを AllThingsSpreadOut と呼びます。そう
- AllThingsBunchedTogether には次のものが含まれる場合があります (
anInt1
コンパクトにするための部分のみ):1,2,1,10,2,3,4,4,5,9,10,10
.- AllThingsSpreadOut には、 [1]
1,1
at [2]2,2
at [3]3
at [4]4,4
at [5]5
at [9]9
at [10]が含まれている可能性があります (ゼロは今のところ使用されていません)10,10,10
。数値自体は に保存されませんが
BaseList
、たとえばMyClass
(1, "John") に保存されることに注意してください。[1] では「Mike」、「John」、[2] では「Mike」、「Dagobart」、[3] では「John」、[10] では「John」「Mike」」 Dagobart" などで、
BaseList
AllThingsSpreadOut[i]のいずれにも重複がないようにします。これはMyClass
、それぞれのBaseList
ハッシュが異なる値になるためです (anInt1 + Name
)。本質的に、
anInt1
はMyClass
AllThingsSpreadOut 内のどこに存在するかを示しますが、anInt1 + name
各 内での一意性を保証しますBaseList
。つまり、AllThingsSpreadOut は、
BaseList
各BaseList
ベクトル位置が類似するもののリストであるベクトルであるということです。次に、AllThingsBunchedTogether から物を削除すると (クリアではなく、以下のコードの IsMarkedToDelete のようにいくつかのアイテムを削除する検索によって)、それらは対応する AllThingsSpreadOut から自動的に消えます。
AllThingsSpreadOut は、押し付けがましいセマンティクスで、AllThingsBunchedTogether の並べ替えとして機能します。AllThingsBunchedTogether は、[] を介した超高速アクセスを可能にします。
編集を終了
#include <vector>
#include <iostream>
#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
class MyClass : public list_base_hook<link_mode<auto_unlink>> // This is a derivation hook
{
public:
std::string name;
bool bIsMarkedToDelete;
int anInt1;
public:
list_member_hook<link_mode<auto_unlink>> member_hook_; // This is a member hook
MyClass(std::string n, int i) : name(n), anInt1(i), bIsMarkedToDelete(false) {}
};
bool IsMarkedToDelete(const MyClass &o)
{
return o.bIsMarkedToDelete;
}
//Define a list that will store MyClass using the public base hook
typedef list<MyClass, constant_time_size<false>> BaseList;
// Define a list that will store MyClass using the public member hook
typedef list<MyClass,
member_hook<MyClass, list_member_hook<link_mode<auto_unlink>>, &MyClass::member_hook_>,
constant_time_size<false> > MemberList;
int main()
{
bool done = false;
std::vector<MyClass> values;
std::string names[] = {"John", "Mike", "Dagobart"};
//BaseList baselist;
//MemberList memberlist;
int i = 0;
while(!done)
{
// Create several MyClass objects, each one with a different value
for (int j = 0; j < 11; ++j)
values.emplace_back(names[j % 3], j);
BaseList baselist;
MemberList memberlist;
// Now insert them in t-he reverse order in the base hook list
for (auto& e : values)
{
baselist.push_front(e);
memberlist.push_back(e);
}
// Now test lists
auto rbit(baselist.rbegin());
auto mit(memberlist.begin());
auto it(values.begin()), itend(values.end());
// Test the objects inserted in the base hook list
for (; it != itend; ++it, ++rbit)
{
if (&*rbit != &*it)
return 1;
}
// Test the objects inserted in the member hook list
for (it = values.begin(); it != itend; ++it, ++mit)
{
if (&*mit != &*it)
return 1;
}
# if 0
for(auto& e : values)
std::cout << e.anInt1 << "\n";
for(auto& e : baselist)
std::cout << e.anInt1 << "\n";
for(auto& e : memberlist)
std::cout << e.anInt1 << "\n";
#endif // 0
if(2 == i)
{
for(auto& e: values)
std::cout << e.name << "\n";
for(auto& e: values)
{
if("Mike" == e.name)
e.bIsMarkedToDelete = true;
}
values.erase(
std::remove_if(values.begin(), values.end(), IsMarkedToDelete), values.end());
}
if(i++ > 3)
{
values.clear();
done = true;
}
std::cout << "\n";
std::cout << values.size() << "\n";
std::cout << baselist.size() << "\n";
std::cout << memberlist.size() << "\n";
}
}