我的代码如下:
std::cin >> str;
for ( char c : str )
if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
这可行吗?或者我将不得不与旧学校一起学习呢?
答案 0 :(得分:29)
也许只有变量i
?
unsigned i = 0;
for ( char c : str ) {
if ( c == 'b' ) vector.push_back(i);
++i;
}
这样您就不必更改基于范围的循环。
答案 1 :(得分:20)
假设str
是std::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;
}