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.