小编典典

如何在 C++ 中标记字符串?

all

Java有一个方便的拆分方法:

String str = "The quick brown fox";
String[] results = str.split(" ");

有没有一种简单的方法可以在 C++ 中做到这一点?


阅读 112

收藏
2022-03-15

共1个答案

小编典典

C 标准库算法非常普遍地基于迭代器而不是具体容器。不幸的是,这使得在 C 标准库中提供类似 Java
split函数变得很困难,尽管没有人认为这会很方便。但它的返回类型是什么?std::vector<std::basic_string<鈥�>>?
也许吧,但随后我们将被迫执行(可能是冗余且成本高昂的)分配。

相反,C++提供了多种基于任意复杂分隔符来拆分字符串的方法,但它们都没有像其他语言那样被封装得很好。无数种方式填满了整个博客文章

在最简单的情况下,您可以迭代
usingstd::string::find直到您点击std::string::npos,然后使用
提取内容std::string::substr

在空格上拆分的更流畅(和惯用但基本)的版本将使用std::istringstream

auto iss = std::istringstream{"The quick brown fox"};
auto str = std::string{};

while (iss >> str) {
    process(str);
}

使用std::istream_iterators,字符串流的内容也可以使用其迭代器范围构造函数复制到向量中。

多个库(例如Boost.Tokenizer)提供特定的标记器。

更高级的拆分需要正则表达式。C++std::regex_token_iterator特别为此目的提供了:

auto const str = "The quick brown fox"s;
auto const re = std::regex{R"(\s+)"};
auto const vec = std::vector<std::string>(
    std::sregex_token_iterator{begin(str), end(str), re, -1},
    std::sregex_token_iterator{}
);
2022-03-15