获取C++基于范围的for循环中当前元素的索引

Sha*_*Hsu 32 c++ iteration for-loop c++11

我的代码如下:

std::cin >> str;
for ( char c : str )
    if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
Run Code Online (Sandbox Code Playgroud)

这可行吗?或者我将不得不与老派进行循环?

Dan*_*rey 32

也许它有足够的变量i

unsigned i = 0;
for ( char c : str ) {
  if ( c == 'b' ) vector.push_back(i);
  ++i;
}
Run Code Online (Sandbox Code Playgroud)

这样您就不必更改基于范围的循环.

  • 也许它并不优雅,但它是所有其他即将推出的解决方案/解决方案的复杂性,可读性,开销等的基线. (13认同)
  • 当然.但我真的认为在C++基于范围的循环中应该有一个常量的`索引`. (10认同)
  • 您询问了当前语言状态,其中不存在"index"之类的内容.语言是否以及如何扩展是一个不同的问题,不属于此. (4认同)
  • 这样做的一个问题-i变量的作用域在循环之外。对于传统的for,有一个地方可以声明额外的变量,当它们都是相同的类型时(作为主“循环变量”)。 (3认同)
  • 请注意,C++20 将允许在“for”语句中声明“i”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0614r1.html。@TomaszGandor 为此,您可以使用大括号中的“I”声明来封装“for”循环。 (3认同)
  • 这是一个解决方案,但并不优雅。此外,我认为这将毫无意义,因为它是在基于范围的循环中实现传统的 for 循环。 (2认同)

Enk*_*ken 24

在 C++ 20 中,我使用这样的初始化程序:

for(unsigned short i = 0; string item : nilai){
   cout << i << "." << "address " << &item << " -> " << item << endl;
   i++;
}
Run Code Online (Sandbox Code Playgroud)

所以,你的情况会是这样的:

for (unsigned short i = 0; char c : str ) {
  if ( c == 'b' ) vector.push_back(i);
  ++i;
}
Run Code Online (Sandbox Code Playgroud)

我不知道“向量”在你的情况下意味着什么,以及 Push_back() 是什么。不要忘记添加-std=c++20(我只是使用g++进行编译,所以我对其他编译器不太了解)。如果需要,您也可以将“i”值从 1 开始。我觉得已经够优雅了


Ben*_*ley 22

假设str是一个std::string具有连续存储的对象或其他对象:

std::cin >> str;
for (char& c : str)
    if (c == 'b') v.push_back(&c - &str[0]);
Run Code Online (Sandbox Code Playgroud)


Kar*_*k T 7

范围循环不会为您提供索引.它旨在抽象出这些概念,让你迭代这个集合.


Ron*_*ren 6

您所描述的在其他语言中被称为“每个都有索引”操作。进行一些快速的谷歌搜索,似乎除了“老式 for 循环”之外,您还有一些相当复杂的解决方案,包括 C++0x lambas 或一些 Boost 提供的宝石。

编辑:作为一个例子,看到这个问题