This code snippet receives string, delimiter(space) and vector as argument and splits the string according to delimiter and stores it in vector. It is not storing anything into vector if i use push_back but works if i use [] operator. Can someone explain why push_back is not working?
void split(const string & input,char delim,vector<string> & elems){
stringstream ss;
ss.str(input);
string item;
int i = 0;
while(getline(ss,item,delim)){
//elems.push_back(item);
elems[i] = item;
i++;
}
}
int main(){
char delim = ' ';
vector<string> item(2);
string input;
getline(cin,input);
split(input,delim,item);
}
If you've pre-allocated the vector with some size (n), then pushback(item) puts item at index n and resizes the vector to an even larger size. If you know the string count due in, then you should use elems[i] = item;
anyway after an allocation of size n.
If you don't know the count coming in, but know it's going to be larger than some n, do not pre-allocate. Instead, RESERVE some memory with elems.reserve(n);
Then use elems.push_back(item);
In the main
function, please change the declaration of item from
vector<string> item(2);
to
vector<string> item;
And change the split
function to use push_back
:
void split(const std::string & input,char delim, std::vector<std::string> & elems){
std::stringstream ss;
ss.str(input);
std::string item;
int i = 0; // no more required unless for some other purpose
while(getline(ss,item,delim)){
elems.push_back(item);
//elems[i] = item;
i++; // no more required
}
}