C++ 中类似 Python 的迭代器习语

标签 python c++ boost iterator

Python 有一些有趣的方法来组合和构建迭代器(参见 itertools )。我对 repeatcyclechain 的功能特别感兴趣。那里的其他迭代器也很有趣。

这些迭代器是用 C++ 还是 boost 实现的?我找到了 Boost 的 adaptors ,但我认为不可能实现迭代器 repeatcyclechain

我当然可以为这些(以及 itertools 中的其他)编写自己的迭代器类,但我想检查一下这个轮子是否已经被发明出来。

最佳答案

好吧,你可以用 C++ 实现它。这是示例:

#include <iostream>
#include <vector>


template <typename It, typename T = typename It::value_type>
class cycle_iterator
{
public:
    typedef cycle_iterator self_type;
    typedef T value_type;
    typedef T& reference;
    typedef T* pointer;
    typedef std::forward_iterator_tag iterator_category;
    typedef int difference_type;
    cycle_iterator(It begin, It end) : m_current(begin), m_begin(begin), m_end(end) { }
    self_type operator++() { advance(); return *this; }
    self_type operator++(int) { self_type i = *this; advance(); return i; }
    reference operator*() { return *m_current; }
    pointer operator->() { return &*m_current; }
    bool operator==(const self_type& rhs) { return m_current == rhs.m_current; }
    bool operator!=(const self_type& rhs) { return m_current != rhs.m_current; }

private:
    void advance() {
        ++m_current;

        if (m_current == m_end)
            m_current = m_begin;
    }

private:
    It m_current;
    It m_begin, m_end;
};


int main()
{
    std::vector<int> vec {1, 2, 3, 4};

    cycle_iterator<std::vector<int>::iterator> it (vec.begin(), vec.end());

    for (int i = 0; i < 10; i++)
        std::cout << *it++ << " ";

    std::cout << std::endl;
    return 0;
}

结果输出:

1 2 3 4 1 2 3 4 1 2

小心,没完没了

实际上,如果您愿意,您可以实现非无限变体(如您所愿),这只是一个简单的演示。

关于C++ 中类似 Python 的迭代器习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63194439/

相关文章:

python - 如何实时读取html并循环插入MySQL?

c++ - 我可以在 C++ 中创建 "attributed"类型吗?

c++ - 我可以从第三个线程监控 boost::lockfree::spsc_queue 吗?

c++ - 如何使用boost weibull分布库进行随机数生成?

c++ - 如何使用 Python 和/或 Lua 编写可编写脚本的讨厌的 C++ 程序?

python - PyCharm 有没有办法在调试时检查对象的方法?

c++ - 究竟什么时候初始化在全局范围内声明的 thread_local 变量?

c++ - 如何在正则表达式中匹配 "["和 "]"?

c++ - 使用信号和线程的事件管理器

python - pandas 基于值而不是计数的窗口滚动计算