我想将一个字符串拆分成连续的非空白字符序列。例如,给定
std::string test(" 35.3881 12.3637 39.3485");
,
我想获得一个指向“35.3881”的迭代器,其增量指向“12.3637”,第二个增量指向“39.3485”。
在给定的示例中,可能(但不能保证)字符串以未知数量的空格开头。此外,非空白字符序列之间的空白数也是未知的。尾随空格也是可能的。
以下代码几乎解决了我的问题:
std::regex regex("\\s+");
std::sregex_token_iterator it(test.cbegin(), test.cend(), regex, -1);
即使使用给定的示例,问题在于迭代器it
最初指向空字符串;这不是我想要的行为。我们如何解决这个问题?
答案 0 :(得分:3)
我只使用普通的stream_iterator:
std::istringstream test(" 35.3881 12.3637 39.3485");
std::copy(std::istream_iterator<std::string>(test),
{},
std::ostream_iterator<std::string>(std::cout, "\n"));
结果:
35.3881
12.3637
39.3485
如评论中所述,如果您发现避免复制数据很重要,则可以使用istrstream
代替instringstream
,如下所示:
#include <strstream>
// ...
std::string test(" 35.3881 12.3637 39.3485");
std::istrstream buffer(test.c_str());
std::copy(std::istream_iterator<std::string>(buffer),
{},
std::ostream_iterator<std::string>(std::cout, "\n"));
注意:<strstream>
并且包含的所有内容都已正式弃用,因此从理论上讲,它可能会在标准的某些未来版本中消失。我最终希望看到一些基于string_view
的东西,它也可以避免复制数据,但我不确定它是否真的存在(它当然不存在于我正在使用的编译器中)力矩)。