Get index of current element in C++ range-based for-loop

C++For LoopC++11Iteration

C++ Problem Overview


My code is as follows:

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

Is this doable? Or I will have to go with the old-school for loop?

C++ Solutions


Solution 1 - C++

Maybe it's enough to have a variable i?

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

That way you don't have to change the range-based loop.

Solution 2 - C++

Assuming str is a std::string or other object with contiguous storage:

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

Solution 3 - C++

The range loop will not give you the index. It is meant to abstract away such concepts, and just let you iterate through the collection.

Solution 4 - C++

What you are describing is known as an 'each with index' operation in other languages. Doing some quick googling, it seems that other than the 'old-school for loop', you have some rather complicated solutions involving C++0x lambas or possibly some Boost provided gems.

EDIT: As an example, see this question

Solution 5 - C++

You can use lambdas in c++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;
    
}

Solution 6 - C++

In C++ 20, I use initializer like this:

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

So, your case will be like:

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

I don't know what 'vector' mean in your case, and what is push_back(). Don't forget to add -std=c++20 (I just use g++ for compiling, so i don't know much about other compiler). You can also start the 'i' value from 1 if you want to. I think it's elegant enough

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionShane HsuView Question on Stackoverflow
Solution 1 - C++Daniel FreyView Answer on Stackoverflow
Solution 2 - C++Benjamin LindleyView Answer on Stackoverflow
Solution 3 - C++Karthik TView Answer on Stackoverflow
Solution 4 - C++Ron DahlgrenView Answer on Stackoverflow
Solution 5 - C++JoelView Answer on Stackoverflow
Solution 6 - C++Singkong jalarView Answer on Stackoverflow