Python的C ++枚举

时间:2018-11-29 15:13:23

标签: c++ c++11

在Python中,enumerate带有一个序列/迭代器,并产生一对整数索引和值本身。在C ++中,我偶尔会发现自己在写作

for (size_t i = 0; i != vector.size(); ++i) {
    auto const &elem = vector[i];
    // ...

我想写的类似于Python

for (auto const &it : enumerate(vector)) {
    // it.first is the index (size_t)
    // it.second is the element (T const&)

这样的enumerate是否存在于STL或诸如Boost之类的通用库中?

4 个答案:

答案 0 :(得分:13)

是的,Boost's adapators::indexed就是这样做的。

他们的示例(该示例还使用了现在冗余的Boost.Assign进行简洁的容器初始化):

#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;
}

尽管it's not hard to write,但标准库中什么都没有。

答案 1 :(得分:3)

以下是使用range-v3的示例。比手工制作的解决方案更冗长,但是恕我直言,您可以从现有视图中组合出这样一个范围,这真是太好了。

#include <range/v3/view/indices.hpp>
#include <range/v3/view/zip.hpp>

using namespace ranges;

std::vector<int> vec{42, 43, 44};

for (const auto& idxAndValue : view::zip(view::indices, vec))
   std::cout << ideAndValue.first << " : " << idxAndValue.second << "\n";;

答案 2 :(得分:2)

另一种有效的方法:

  1. 带有元素的引用,
  2. 基于数组的容器,和
  3. 元素不会超载operator&


for(auto const &it : vector) {
    size_t index = &it - vector.data();
}

答案 3 :(得分:1)

这是使用高阶函数的版本。我喜欢它,因为它易于实现,并且不需要您了解结构化绑定的细微差别。它也不需要任何额外的依赖。

template <typename Container, typename F>
void enumerate(Container&& c, F&& f)
{
    std::size_t i = 0;
    for(auto&& x : std::forward<Container>(c)) 
    { 
         f(i++, forward_like<Container>(x)); 
    }
}

(如果forward_like rvalue ,则x移动Container的位置。)

用法:

enumerate(std::vector{'a', 'b', 'c'}, [](auto index, auto x) 
{
    std::cout << index << ": " << x << '\n';
});

打印:

0: 'a'
1: 'b'
2: 'c'

live example on wandbox.org


符合C ++ 11的版本:live example on wandbox.org