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

时间:2013-03-01 02:17:40

标签: c++ for-loop c++11 iteration

我的代码如下:

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

这可行吗?或者我将不得不与旧学校一起学习呢?

5 个答案:

答案 0 :(得分:29)

也许只有变量i

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

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

答案 1 :(得分:20)

假设strstd::string或其他具有连续存储空间的对象:

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

答案 2 :(得分:6)

范围循环不会为您提供索引。它旨在抽象出这些概念,让你遍历集合。

答案 3 :(得分:4)

您所描述的内容在其他语言中称为“每个带索引”操作。做一些快速的谷歌搜索,似乎除了'老派for循环',你有一些相当复杂的解决方案涉及C ++ 0x lambas或可能一些Boost提供的宝石。

编辑:例如,请参阅此question

答案 4 :(得分:4)

你可以在c ++ 11中使用lambdas:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>

using namespace std;


int main() {
    std::string str;
    std::vector<char> v;
    auto inserter = std::back_insert_iterator<decltype(v)>(v);

    std::cin >> str;
    //If you don't want to read from input
    //str = "aaaaabcdecccccddddbb";

    std::copy_if(str.begin(), str.end(), inserter, [](const char c){return c == 'b';});

    std::copy(v.begin(),v.end(),std::ostream_iterator<char>(std::cout,","));

    std::cout << "Done" << std::endl;

}