提问人:DWil 提问时间:7/31/2023 最后编辑:DWil 更新时间:7/31/2023 访问量:75
如何包装不使用连续内存的 STL 容器迭代器?
How can I wrap STL container iterators that don't use contiguous memory?
问:
我正在编写一个自定义容器,该容器在内部使用 a 来实现。我希望容器支持基于范围的循环,因此实现了 and 函数。我不想公开 作为返回值,所以我在自定义容器中编写了自己的迭代器来返回。std::deque
for
begin()
end()
std::deque::iterator
begin()
end()
我的迭代器通过指向自定义容器所包含类型的指针进行构造,因此我可以取消引用要构造的迭代器。但我不能尊重,因为它是未定义的行为(尽管如果我换成它确实有效,但我想这是因为连续记忆)。deque::begin()
deque::end()
deque
vector
如何正确包装此实例,以便能够正确识别容器?std::deque
end()
我可以用一个向量来实现它并实现必要的操作,但我认为这是一个有趣的问题。PushFront()
struct Foo;
// Example custom container
class FooQueue{
public:
FooId PushFront(Foo& foo);
FooId PushBack(Foo& foo);
void RemoveFoo(FooId id);
// Custom iterator
struct Iterator{
using iterator_category = std::random_access_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = Foo;
using pointer = value_type*;
using reference = value_type&;
explicit Iterator(pointer ptr) : ptr_(ptr){
Iterator& operator++()
{
ptr_++;
return *this;
}
Iterator operator++(int)
{
Iterator tmp = *this;
ptr_++;
return tmp;
}
friend bool operator==(const Iterator& lhs, const Iterator& rhs){ return lhs.ptr_ == rhs.ptr_ };
friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { return !(lhs == rhs); }
private:
pointer ptr_;
};
Iterator begin(){ return Iterator(&(*deque_.begin())); }
Iterator end() { return Iterator(&(*deque_.end())); } /* !!! Undefined behavior: Not allowed to
dereference .end() !!! */
private:
std::deque<Foo> deque_;
};
答: 暂无答案
评论
std::deque::iterator
std::deque
std::deque::iterator
using iterator = std::deque::iterator; using const_iterator = std::deque::iterator;
std::deque
std::vector
using Iterator = std::deque<Foo*>::iterator
value_type
Foo*
for (auto& f: myFooQueue) { ... }
f
Foo*
Foo&