C++ Boost::split

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()将输入分成多个部分。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程