我用于简单字符串拆分的一段常见代码如下所示:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
有人提到这会默默地“吞下” std::getline
. 当然,我同意是这样的。但我突然想到,在实践中可能会出现什么问题,我需要担心。基本上这一切都归结为:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
if(/* what error can I catch here? */) {
// *** How did we get here!? ***
}
return elems;
}
Astringstream
由 a 支持string
,因此我们不必担心与从文件读取相关的任何问题。这里没有进行类型转换,因为getline
只是读取直到看到行分隔符或EOF
. 所以我们不能得到任何boost::lexical_cast
需要担心的错误。
除了未能分配足够的内存可能出错之外,我根本想不出什么,但这只会在事件发生std::bad_alloc
之前抛出一个很好的结果。std::getline
我错过了什么?