Ответ 1
Предполагая, что str
является std::string
или другим объектом со смежным хранилищем:
std::cin >> str;
for (char& c : str)
if (c == 'b') v.push_back(&c - &str[0]);
Мой код выглядит следующим образом:
std::cin >> str;
for ( char c : str )
if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
Это выполнимо? Или мне придется идти со старой школой для петли?
Предполагая, что str
является std::string
или другим объектом со смежным хранилищем:
std::cin >> str;
for (char& c : str)
if (c == 'b') v.push_back(&c - &str[0]);
Возможно, этого достаточно, чтобы иметь переменную i
?
unsigned i = 0;
for ( char c : str ) {
if ( c == 'b' ) vector.push_back(i);
++i;
}
Таким образом, вам не нужно менять цикл на основе диапазона.
То, что вы описываете, называется операцией "каждый с индексом" на других языках. Выполняя некоторые быстрые поисковые запросы, кажется, что, помимо "старой школы для цикла", у вас есть довольно сложные решения, связанные с С++ 0x lambas или, возможно, с некоторыми камнями Boost.
EDIT: в качестве примера см. этот question
Цикл диапазона не даст вам индекс. Он предназначен для абстрагирования таких понятий и просто позволяет вам проходить через коллекцию.
Вы можете использовать lambdas в С++ 11:
#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;
}