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

Time:06-28

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:

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?

CodePudding user response:

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.

  • Related