Подтвердить что ты не робот

Получить индекс текущего элемента в С++ для цикла

Мой код выглядит следующим образом:

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

Это выполнимо? Или мне придется идти со старой школой для петли?

4b9b3361

Ответ 1

Предполагая, что str является std::string или другим объектом со смежным хранилищем:

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

Ответ 2

Возможно, этого достаточно, чтобы иметь переменную i?

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

Таким образом, вам не нужно менять цикл на основе диапазона.

Ответ 3

То, что вы описываете, называется операцией "каждый с индексом" на других языках. Выполняя некоторые быстрые поисковые запросы, кажется, что, помимо "старой школы для цикла", у вас есть довольно сложные решения, связанные с С++ 0x lambas или, возможно, с некоторыми камнями Boost.

EDIT: в качестве примера см. этот question

Ответ 4

Цикл диапазона не даст вам индекс. Он предназначен для абстрагирования таких понятий и просто позволяет вам проходить через коллекцию.

Ответ 5

Вы можете использовать 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;

}