是否有任何(方便的)方法可以在 C++11 "foreach"语句中检索当前迭代 #?

Is there any (convenient) way of retrieving current iteration # inside C++11 "foreach" statement?

本文关键字:语句 foreach 检索 迭代 C++11 方便 任何 方法 是否      更新时间:2023-10-16

我想知道是否有可能以某种方式从c++11 foreach语句中提取当前的迭代数。

在这样的代码中:
for(auto &i: vect)
    if(i == 0) zero_value_index = /* here I want my index */;

我找不到另一种方法,但使用老式的forint i来轻松获得我的索引。

想法?

你可以,我不知道,计算迭代:

int i = 0;
for (auto& el : container) {
    if (el == 0) zero_value_index = i;
    ++i;
}

除非你遵循Ben Voigt的答案,否则简短的答案是否定的。

既然你有一个vector,那么老式的for循环就没有什么问题了。其他的都是不必要的复杂。

typedef std::vector <int>::size_type size_type ;
for(size_type i = 0; i < vect.size (); ++i) {
    // ...
}

这可以用于其他容器,如字符串,但不能用于其他容器:

template <class Container>
void DoStuff (Container &container)
{
    typedef Container::size_type size_type ;
    for (size_type i = 0; i < container.size (); ++i) {
        //...       
    }
}

或者你可以写一些像这样难看的东西:

template <class Container>
struct StoreIndex
{
    typedef typename Container::size_type size_type ;
    typedef typename Container::value_type value_type ;
    StoreIndex (Container &container) : container (container), index (0)
    {
    }
    size_type index ;
    Container &container ;
    value_type operator () () {
        if (container [index] == 0) {
            return index++ ;
        }
        else {
            return container [index++] ;
        }
    }
};

然后做:

std::generate (std::begin (v), std::end (v), StoreIndex <std::vector <int> > (v)) ;

当然,这和其他两种方法一样有局限性(比如std::map)。

一夜之间我又有了另一个想法。答案是肯定的。不用计数就能找到索引。这是因为以下两条规则:

    std::vector中的
  • 数据保证是连续的。
  • 减去两个指针会得到一个以"对象大小"为单位的距离,而不是字节。

.

#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<string> rhyme = { "humpty", "dumpty", "sat", "on", "a", "wall" };

int main()
{
    for(const auto& s : rhyme) {
        if (s == "on") {
            const size_t index = &s - rhyme.data(); // index computed here
            cout << "found at index " << index << endl;
        }    
    }
   return 0;
}