Python在c ++中枚举

时间:2017-12-23 00:20:52

标签: c++ enumerator

在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 ++中有类似的东西吗?

3 个答案:

答案 0 :(得分:1)

Boost提供了一个允许执行类似操作的适配器:

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

以下代码来自上面的链接

main()

答案 1 :(得分:1)

也许你可以像这样模仿它:

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

答案 2 :(得分:1)

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

这是一个草图(c ++ - ish伪代码),我在任何地方使用值,它们应该被适当的引用/转发替换,你也应该修复你如何获得类型(使用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);
}