使用assign,substring和find方法在空白上解析字符串

时间:2012-02-25 06:18:54

标签: c++ string parsing

我想使用空格作为分隔符来解析字符串。我知道可以使用字符串库中的3种方法assignsubstringfind来完成。基本上我想将我的目标字符串从字符串的开头分配给第一次出现的空格。

就像这样

while(!line.empty())
{

    line.assign(line.substr(0, line.find(" ")
    line.erase(0, line.find(" ");

}

我的问题是,这是解析字符串的好方法吗?

1 个答案:

答案 0 :(得分:2)

您需要的不仅仅是一个line变量:如果字符串包含非空格字符,您的代码将不会终止。当然,这假设它首先编译,因为有许多括号和分号丢失(同样,你的问题与你的代码不匹配:没有函数substring;如果你想编程有效地,你必须非常精确地一切:计算机把你的陈述非常字面化。你可能想把你的line剁成碎片并将它们放入某种容器中。

一旦超过这些微不足道的方面,您可能需要考虑使用' '而不是" ",因为在这种情况下,编译器和库可以假设您只想查找一个字符而不是字符序列。这可能会快得多。但是,这实际上不是空格而只是空格。 Whitespace还包含许多特殊字符,例如'\t'(制表符),'\r'(回车),'\n'(换行符),'\v'(垂直制表符),{{1 }(退格)和'\b'(换页)。说到速度,你可能不希望从字符串的开头'\f'位,因为这会产生O(n * n)算法,而这可以做到O(n),例如,通过保持变量与位置。这也避免了搜索两次不必要的昂贵的问题。如果有两个相邻的字符串,您还应该考虑这种行为:它应该在您的序列中产生一个空字符串,还是应该将其视为有一个空格(在这种情况下您可能还想使用erase())。

实际上,我只是重读了问题陈述:如果你只想将字符串提取到第一个空格,如果你坚持的话,你不需要first_not_of()erase()或循环使用empty()。但是,即使使用两个assign()成员也可以完成此操作:std::stringfind()

erase()