フックから継承する がありますboost::intrusive::list<Foo, constant_time_size<false>>
。list elementを使用すると、 を呼び出してイテレータを取得できます。私の質問は、このイテレータを使用してリストをトラバースする方法です。特に、この要素がリスト内の唯一のものであるかどうかを確認する方法はありますか?Foo
list_base_hook<auto_unlink>
foo
list::s_iterator_to(foo)
ソースは、その値の特性でlist
a を使用することを示唆しcicular_list_algorithms
ています。おそらく、次のテストを使用できますか?
auto itr1 = list_t::s_iterator_to(foo);
auto itr2 = list_t::s_iterator_to(foo);
&(*++itr1) == &(*--itr2);
それはかなりハックに見えますが、一見うまくいきます。それが正しく慣用的なものかどうかはわかりません。誰かアドバイスしてくれませんか?
完全なリスト:
#include <iostream>
#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
typedef list_base_hook<link_mode<auto_unlink> > auto_unlink_hook;
class Foo : public auto_unlink_hook
{
int int_;
public:
Foo(int i = 0) : int_(i) {}
int get_int() { return int_; }
void unlink() { auto_unlink_hook::unlink(); }
bool is_linked() { return auto_unlink_hook::is_linked(); }
};
int main()
{
typedef list<Foo, constant_time_size<false>> ListType;
ListType l;
Foo foo1{42};
l.push_back(foo1);
auto itr1 = ListType::s_iterator_to(foo1);
auto itr2 = ListType::s_iterator_to(foo1);
std::cout << (&(*++itr1) == &(*--itr2)) << std::endl;
Foo foo2{43};
l.push_back(foo2);
itr1 = ListType::s_iterator_to(foo1);
itr2 = ListType::s_iterator_to(foo1);
std::cout << (&(*++itr1) == &(*--itr2)) << std::endl;
foo1.unlink();
return 0;
}
Yes, I do realize dereferencing ++itr1
and --itr1
is wrong. Is there any way that I can compare the addresses of the underlying nodes directly? I imagine foo
has both links to its predecessor and successor and they should be equal to each other if foo
is the only element.