1

フックから継承する がありますboost::intrusive::list<Foo, constant_time_size<false>>。list elementを使用すると、 を呼び出してイテレータを取得できます。私の質問は、このイテレータを使用してリストをトラバースする方法です。特に、この要素がリスト内の唯一のものであるかどうかを確認する方法はありますか?Foolist_base_hook<auto_unlink>foolist::s_iterator_to(foo)

ソースは、その値の特性でlista を使用することを示唆し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.

4

1 に答える 1