我想使用空格作为分隔符来解析字符串。我知道可以使用字符串库中的 3 种方法来完成,assign
、substring
和 find
。基本上我想将我的目标字符串分配给从字符串开头到第一次出现的空格的子字符串。
应该是这样的
while(!line.empty())
{
line.assign(line.substr(0, line.find(" ")
line.erase(0, line.find(" ");
}
我的问题是,这是解析字符串的好方法吗?
最佳答案
您需要的不仅仅是一个 line
变量:如果字符串包含非空格字符,您的代码将不会终止。当然,这假设它首先编译,因为缺少许多括号和分号(另外,您的问题与您的代码不匹配:没有函数 substring
;如果您想要有效地编程,你必须对一切非常精确:计算机将你的陈述非常字面化)。您可能想将 行
分成几部分,然后将它们放入某种容器中。
一旦了解了这些琐碎的方面,您可能会考虑使用 ' '
而不是 ""
因为在这种情况下,编译器和库可以假设您想要查看仅针对一个字符而不是一系列字符。这可能会快很多。然而,这实际上不是空白,而只是空格。空格还包括许多特殊字符,如 '\t'
(制表符)、'\r'
(回车)、'\n'
(换行符)、'\v'
(垂直制表符)、'\b'
(退格键)和 '\f'
(表单喂养)。说到速度,您可能不想从字符串的开头 erase()
位,因为这会产生一个 O(n * n) 算法,而这可以完成 O(n) 例如通过保持一个变量的位置。这也避免了不必要的昂贵的两次搜索问题。如果有两个相邻的字符串,您还应该考虑这种行为:这是否会在您的序列中产生一个空字符串,或者是否应该将其视为有一个空格(在这种情况下,您可能还想使用 first_not_of()
)。
实际上,我只是重读了问题陈述:如果你只想将字符串提取到第一个空格,则不需要erase()
、empty()
,或者如果你坚持使用 assign()
则循环。然而,这甚至可以使用两个 std::string
成员来完成:find()
和 erase()
:
line.erase(line.find(" \t\r\n\v\b\f"));
关于c++ - 使用 assign、substring 和 find 方法解析空白字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441822/