Python 在 C++ 中的枚举

Python's enumerate in c++

在 Python 中,而不是

colors = ['red', 'green', 'blue', 'yellow']

for i in range(len(colors)):
    print i, '--->', colors[i]

能写

for i, color in enumerate(colors):
    print i, '--->', color

c++有类似的东西吗?

Boost 提供了一个适配器,可以做类似的事情:

http://www.boost.org/doc/libs/1_63_0/libs/range/doc/html/range/reference/adaptors/reference/indexed.html

以下代码取自上面的link

#include <boost/range/adaptor/indexed.hpp>
#include <boost/assign.hpp>
#include <iterator>
#include <iostream>
#include <vector>

int main(int argc, const char* argv[])
{
    using namespace boost::assign;
    using namespace boost::adaptors;

    std::vector<int> input;
    input += 10,20,30,40,50,60,70,80,90;

    for (const auto& element : input | indexed(0))
    {
        std::cout << "Element = " << element.value()
                  << " Index = " << element.index()
                  << std::endl;
    }

    return 0;
}

也许你可以这样模拟:

int i = 0;
for (auto color : { "red", "green", "blue", "yellow" })
    std::cout << i++ << "--->" << color << std::endl;

你实际上可以在 c++17 中实现类似的东西。

这是一个草图(c++-ish 伪代码),我到处都使用值,它们应该被适当的 references/forwarding 替换,你也应该修复你如何获得类型(使用 iterator_traits),可能支持未知大小,可能实现适当的迭代器接口等

template <typename T>
struct EnumeratedIterator {
    size_t index;
    T iterator;
    void operator++() {
        ++iterator;
    }
    std::pair<size_t, T>() {
        return {index, *iterator};
    }
    bool operator !=(EnumeratedIterator o) {
        return iterator != o.iterator;
    }
}

template <typename T>
struct Enumerated {
    T collection;
    EnumeratedIterator<typename T::iterator> begin() {
        return {0, collection.begin()};
    }
    EnumeratedIterator<typename T::iterator> end() {
        return {collection.size(), collection.end()};
    }
}

auto enumerate(T col) {
    return Enumerated<T>(col);
}

然后像

一样使用它
for (auto [index, color] : enumerate(vector<int>{5, 7, 10})) {
    assert(index < color);
}