问题
写LeetCode 第8题的时候,遇到了这个问题.
原因
str.erase(0, str.find_first_not_of(' '));
str.assign(str.begin(),str.begin() + str.find_first_of(' '));
由于需要去除字符串的前后干扰字符 比如 " -42 with word",我需要得到-42这个数,就需要去除前面的空格,所以采用了erase
的方法,然后截取到非空格的地方.
但是 find_first_of()
方法可能找不到空格,那该方法就会返回std::string::npos
其实最主要是C++标准未提供截取字符串的方法.而是提供了最基本的find操作.
by the way : npos的定义
static const size_type npos = -1;
解决
先通过 find_first_of()
判断下是不是存在要找的部分
if(str.find_first_of(' ')!=std::string::npos){
str.assign(str.begin(),str.begin() + str.find_first_of(' '));
}
本质
其实本质问题(合理的猜测)是:assgin
方法不可以assign(s.begin(),s.begin()-1)
,这需要读下源码.(至少LeetCode的编译器是这样的,因为我用g++编译是没有问题的,也不抛异常).而erase
方法可以这样调用erase(0,-1)
;
也排除了begin()-1的访问.
所以基本可以肯定是assign
的问题