gpt4 book ai didi

c++ - 在第三方容器中使用基于范围的 for 循环

转载 作者:行者123 更新时间:2023-11-30 01:53:48 28 4
gpt4 key购买 nike

我目前正在使用第三方库,其中包含一个仅提供索引查找的类,即 operator[]

我想对此类的内容执行基于范围的 for 循环。但是,由于从未编写过迭代器或迭代器适配器,我很迷茫。看来编写迭代器并不是一件简单的工作。

我想要的用法是:

for(auto element : container)
{
...
}

不必写:

for(int i = 0; i < container.size(); ++i)
{
auto element = container[i];
...
}

如何实现? Boost 是否提供此功能?

最佳答案

编写迭代器实际上是一项相当简单的任务,但它会变得非常乏味。由于您的容器支持按整数索引,我假设它的迭代器将属于随机访问迭代器类别(如果它们存在)。这需要很多样板文件!

但是,要支持基于范围的 for 循环,您只需要一个前向迭代器。我们将为实现前向迭代器要求的容器编写一个简单的包装器,然后编写两个函数 Iterator begin(Container&)Iterator end(Container&) 来启用在基于范围的 for 循环中使用的容器。

这个 Iterator 将包含对容器的引用、容器的大小以及该容器中的当前索引:

template<template<typename> class C, typename T>
class indexer : public std::iterator<std::forward_iterator, T>
{
public:
indexer(C<T>& c, std::size_t i, std::size_t end)
: c_(std::addressof(c)), i_(i), end_(end) {}

T& operator*() const {
return c_[i_];
}

indexer<C, T>& operator++() {
++i_;
return *this;
}
indexer<C, T> operator++(int) {
auto&& tmp = *this;
operator++();
return tmp;
}

bool operator==(indexer<C, T> const& other) const {
return i_ == other.i_;
}
bool operator!=(indexer<C, T> const& other) const {
return !(*this == other);
}

private:
C<T>* c_;
std::size_t i_, end_;
};

继承自 std::iterator 方便地声明适当的 typedef 以与 std::iterator_traits 一起使用。

然后,您将定义 beginend 如下:

template<typename T>
indexer<Container, T> begin(Container<T>& c) {
return indexer<Container, T>(c, 0, c.size());
}

template<typename T>
indexer<Container, T> end(Container<T>& c) {
auto size = c.size();
return indexer<Container, T>(c, size, size);
}

无论您的示例中的 container 是什么类型,都请关闭 Container,这样您就可以正常使用了!

所有各种迭代器的要求和行为可以在标准第 24.2.2 节的表格中找到,这些表格反射(reflect)在 cppreference.com here。 .

可以在 Coliru 上找到上面的随机访问迭代器实现,以及使用简单 vector_view 类的演示。或 ideone.com .

关于c++ - 在第三方容器中使用基于范围的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22813899/

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