此代码段接收字符串,分隔符(空格)和向量作为参数,并根据分隔符拆分字符串并将其存储在向量中。如果我使用push_back,它不会将任何内容存储到向量中,但如果我使用[]运算符则无效。有人可以解释为什么push_back不起作用吗?
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);
}
答案 0 :(得分:4)
如果您已预先分配了具有某个大小(n)的向量,则pushback(item)将项目放在索引n处,并将向量调整为更大的大小。如果您知道到期的字符串数,那么在分配大小n后,您应该使用elems[i] = item;
。
如果您不知道计数进入,但知道它会比某些n大,请不要预先分配。相反,请使用elems.reserve(n);
然后使用elems.push_back(item);
答案 1 :(得分:0)
在main
函数中,请更改项目声明
vector<string> item(2);
到
vector<string> item;
并将split
功能更改为使用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
}
}