Java有一个方便的拆分方法:
String str = "The quick brown fox"; String[] results = str.split(" ");
有没有一种简单的方法可以在 C++ 中做到这一点?
C 标准库算法非常普遍地基于迭代器而不是具体容器。不幸的是,这使得在 C 标准库中提供类似 Java 的split函数变得很困难,尽管没有人认为这会很方便。但它的返回类型是什么?std::vector<std::basic_string<鈥�>>? 也许吧,但随后我们将被迫执行(可能是冗余且成本高昂的)分配。
split
std::vector<std::basic_string<鈥�>>
相反,C++提供了多种基于任意复杂分隔符来拆分字符串的方法,但它们都没有像其他语言那样被封装得很好。无数种方式填满了整个博客文章。
在最简单的情况下,您可以迭代 usingstd::string::find直到您点击std::string::npos,然后使用 提取内容std::string::substr。
std::string::find
std::string::npos
std::string::substr
在空格上拆分的更流畅(和惯用但基本)的版本将使用std::istringstream:
std::istringstream
auto iss = std::istringstream{"The quick brown fox"}; auto str = std::string{}; while (iss >> str) { process(str); }
使用std::istream_iterators,字符串流的内容也可以使用其迭代器范围构造函数复制到向量中。
std::istream_iterator
多个库(例如Boost.Tokenizer)提供特定的标记器。
更高级的拆分需要正则表达式。C++std::regex_token_iterator特别为此目的提供了:
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{} );