Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why do I have to make a 2d array for this

I was solving a question online on strings where we had to perform run-length encoding on a given string, I wrote this function to achieve the answer

using namespace std;

string runLengthEncoding(string str) {
  vector <char> encString;
  int runLength = 1;
  for(int i = 1; i < str.length(); i++)
    {
      if(str[i - 1] != str[i] || runLength == 9)
      {
        encString.push_back(to_string(runLength)[0]);
        encString.push_back(str[i - 1]);
        runLength = 0;
      }
      runLength++;
    }
  encString.push_back(to_string(runLength)[0]);
  encString.push_back(str[str.size() - 1]);

  string encodedString(encString.begin(), encString.end());
  
  return encodedString;
      
}

Here I was getting a very long error on this particular line in the for loop and outside it when I wrote:

encString.push_back(to_string(runLength));

which I later found out should be:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

encString.push_back(to_string(runLength)[0]);

instead
I don’t quite understand why I have to insert it as a 2D element(I don’t know if that is the right way to say it, forgive me I am a beginner in this) when I am just trying to insert the integer…
In stupid terms – why do I gotta add [0] in this?

>Solution :

std::to_string() returns a std::string. That’s what it does, if you check your C++ textbook for a description of this C++ library function that’s what you will read there.

encString.push_back( /* something */ )

Because encString is a std::vector<char>, it logically follows that the only thing can be push_back() into it is a char. Just a single char. C++ does not allow you to pass an entire std::string to a function that takes a single char parameter. C++ does not work this way, C++ allows only certain, specific conversions betweens different types, and this isn’t one of them.

And that’s why encString.push_back(to_string(runLength)); does not work. The [0] operator returns the first char from the returned std::string. What a lucky coincidence! You get a char from that, the push_back() expects a single char value, and everyone lives happily ever after.

Also, it is important to note that you do not, do not "gotta add [0]". You could use [1], if you have to add the 2nd character from the string, or any other character from the string, in the same manner. This explains the compilation error. Whether [0] is the right solution, or not, is something that you’ll need to figure out separately. You wanted to know why this does not compile without the [0], and that’s the answer: to_string() returns a std::string put you must push_back() a single char value, and using [0] makes it happen. Whether it’s the right char, or not, that’s a completely different question.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading