我想使用一个循环列表。
没有实现我自己的(就像这个人那样)我有什么选择?
具体来说,我想要做的是遍历对象列表。当我的迭代器到达列表的末尾时,它应该会自动返回到开头。(是的,我意识到这可能很危险。)
请参阅 Vladimir 对 a 的定义circular_iterator
:“circular_iterator 永远不会与 CircularList::end() 相等,因此您始终可以取消引用此迭代器。”
我想使用一个循环列表。
没有实现我自己的(就像这个人那样)我有什么选择?
具体来说,我想要做的是遍历对象列表。当我的迭代器到达列表的末尾时,它应该会自动返回到开头。(是的,我意识到这可能很危险。)
请参阅 Vladimir 对 a 的定义circular_iterator
:“circular_iterator 永远不会与 CircularList::end() 相等,因此您始终可以取消引用此迭代器。”
没有标准的循环列表。
但是,Boost 中有一个循环缓冲区,这可能会有所帮助。
如果您不需要任何花哨的东西,您可以考虑只使用 avector
并使用索引访问元素。你可以只mod
用你的索引和向量的大小来实现与循环列表大致相同的事情。
如果你想要一个看起来像迭代器的东西,你可以自己滚动,看起来像
template <class baseIter>
class circularIterator {
private:
baseIter cur;
baseIter begin;
baseIter end;
public:
circularIterator(baseIter b, baseIter e, baseIter c=b)
:cur(i), begin(b), end(e) {}
baseIter & operator ++(void) {++cur; if(cur == end) {cur = begin;}}
};
(其他迭代器操作留给读者练习)。
list<int>::iterator circularNext(list<int> &l, list<int>::iterator &it)
{
return std::next(it) == l.end() ? l.begin() : std::next(it);
}
除了@captain-segfault 和@mahmoud-khaled 的以迭代器为中心的答案之外,您还可以std::list
通过更改从中检索元素的操作将其用作循环列表。在处理列表时,使用splice将列表的一端移动到另一端。
template <typename T>
T & circularFront(std::list<T> & l)
{
l.splice(l.end(), l, l.begin());
return l.back();
}
template <typename T>
T & circularBack(std::list<T> & l)
{
l.splice(l.begin(), l, l.rbegin());
return l.front();
}
我找到了这个解决方案。对我来说很好。
std::list<int> List{ 1,2,3,4,5,6 };
auto it = List.end();
it--;
it._Ptr->_Next = List.begin()._Ptr; // Next Node of the last elemen is now first elemen of the List
List.begin()._Ptr->_Prev = it._Ptr; // Prev Node of the first element is now Last node
for (int num : List)
{
std::cout << num << '\n';
}
在这种情况下,我们将无限循环。也应该向后工作。
1
2
3
4
5
6
1
2
3
4
5
6
1
.
.