gpt4 book ai didi

c++ - boost::intrusive::list with the auto-unlink hook:我可以使用列表中的值来确定列表是否只有一个元素吗?

转载 作者:行者123 更新时间:2023-11-30 05:05:16 24 4
gpt4 key购买 nike

我有一个 boost::intrusive::list<Foo, constant_time_size<false>> , 其中Foo继承自 list_base_hook<auto_unlink>钩。带有列表元素 foo ,我可以通过调用 list::s_iterator_to(foo) 来获取它的迭代器.我的问题是如何使用此迭代器遍历列表。特别是,有没有办法判断这个元素是否是列表中的唯一元素?

来源建议list使用 cicular_list_algorithms在其值(value)特征中,也许我可以使用以下测试?

auto itr1 = list_t::s_iterator_to(foo);
auto itr2 = list_t::s_iterator_to(foo);
&(*++itr1) == &(*--itr2);

它看起来很老套,但看起来很管用。我不确定它是否正确和惯用。有人可以建议吗?

完整 list :

#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;
}

是的,我确实实现了取消引用 ++itr1--itr1是错的。有什么办法可以直接比较底层节点的地址吗?我想foo具有指向其前任和继任者的两个链接,如果foo,它们应该彼此相等是唯一的元素。

最佳答案

我尝试了这些,并且有效。但是,它与实现细节紧密结合。思路是从值中获取底层节点指针并比较指针。

typedef list<Foo, constant_time_size<false>> ListType;                                    
ListType l;
Foo foo1{42};
l.push_back(foo1);

ListType::const_node_ptr cur = ListType::value_traits::to_node_ptr(foo1);
std::cout << (ListType::node_traits::get_previous(cur) == ListType::node_traits::get_next(cur)) << std::endl;

Foo foo2{43};
l.push_back(foo2);
std::cout << (ListType::node_traits::get_previous(cur) == ListType::node_traits::get_next(cur)) << std::endl;

关于c++ - boost::intrusive::list with the auto-unlink hook:我可以使用列表中的值来确定列表是否只有一个元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48485135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com