C++ Boost::split
在C中的strtok函数与该函数相似。通过分隔符将输入序列创建为标记。通过断言,提供了分隔符。
语法
Template:
split(Result, Input, Predicate Pred);
Parameters:
Input: A container which will be searched.
Pred: A predicate to identify separators.
This predicate is supposed to return true
if a given element is a separator.
Result: A container that can hold copies of
references to the substrings.
Returns: A reference the result
Time Compelxity: O(n)
Auxilary Space: O(1)
应用程序:使用这种技术,将字符串分成子字符串并通过分隔符分开。
示例
Input : boost::split(result, input, boost::is_any_of("\t"))
input = "geeks\tfor\tgeeks"
Output : geeks
for
geeks
Explanation: Here in input string we have "geeks\tfor\tgeeks"
and result is a container in which we want to store our result
here separator is "\t".
使用boost::split函数对提供的字符串进行分词
Boost为C++标准库提供了强大的工具,可以添加成熟、经过充分测试的库。本文将介绍Boost字符串算法库的一个组件boost::split函数。该函数具有许多用于操纵字符串的技巧,包括剪切和替换。boost::split函数将一个字符串序列划分为标记,并用定界符分隔它们。第三个参数应该是定界符,用户应该在谓词函数中指定。如果给定的元素是定界符,则提供的函数必须返回true。
为了识别提供的文本中的空格并将其分隔成标记,我们在示例中使用了isspace函数对象。为了保存标记化的子字符串,boost::split还需要一个目标序列容器。值得注意的是,函数调用会在第一个参数(即目标容器本身)之后覆盖目标容器之前的内容。
#include
#include
#include
#include
#include
using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;
int main() {
string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
vector words;
boost::split(words, text, isspace);
for (const auto &item : words) {
cout << item << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
输出:
Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;
在前面的代码示例中,boost::split方法在两个或两个以上的分隔符彼此接近时,会存储空字符串。即使如此,如果我们在第四个可选参数boost::token compress 上指定了,相邻的分隔符也会被合并,如下面的示例所示。请记住,除非在计算机上安装了Boost库,否则这两个代码片段将无法运行。
#include
#include
#include
#include
#include
using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;
using std::stringstream;
int main() {
string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
vector words;
boost::split(words, text, isspace, boost::token_compress_on);
for (const auto &item : words) {
cout << item << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
输出:
Lorem; ipsum; dolor; sit; amet,; consectetur; adipiscing; elit.;
使用stringstream和getline函数根据分隔符拆分字符串
要用指定的字符分隔符拆分文本,可以使用getline函数和stringstream类。在这种情况下,不需要Boost头文件,因为我们只是使用STL工具。请注意,这个代码版本较长,需要额外的步骤来组合相邻的分隔符字母。
#include
#include
#include
#include
using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;
using std::stringstream;
int main() {
string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
vector words;
char space_char = ' ';
stringstream sstream(text);
string word;
while (std::getline(sstream, word, space_char)) {
words.push_back(word);
}
for (const auto &item : words) {
cout << item << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
输出:
Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;
分割
对于一个典型的应用场景,分割算法是对查找迭代器的扩展。这些算法使用查找迭代器将所有匹配项存储在给定容器中。提取的子字符串必须能够以引用形式(如迭代器范围)或副本形式(如std::string)存储在此容器中。
提供了两种算法。在input中,find all()定位到每个字符串的每个实例。split()将输入分成多个部分。