C++ Boost Tokenizer使用详细讲解

 更新时间:2022年11月11日 16:09:26   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

介绍

库 Boost.Tokenizer 允许您通过将某些字符解释为分隔符来迭代字符串中的部分表达式。使用 boost::tokenizer 迭代字符串中的部分表达式

示例一

使用 boost::tokenizer 迭代字符串中的部分表达式

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  tokenizer tok{s};
  for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it)
    std::cout << *it << '\n';
}

Boost.Tokenizer 在 boost/tokenizer.hpp 中定义了一个名为 boost::tokenizer 的类模板。它期望一个标识连贯表达式的类作为模板参数。示例 10.1 使用了 boost::char_separator 类,它将空格和标点符号解释为分隔符。

必须使用 std::string 类型的字符串初始化标记器。使用成员函数 begin() 和 end(),可以像容器一样访问标记器。用于初始化标记器的字符串的部分表达式可通过迭代器获得。部分表达式的计算方式取决于作为模板参数传递的类的类型。

因为 boost::char_separator 默认将空格和标点符号解释为分隔符,所以示例 10.1 会显示 Boost、C、+、+ 和库。 boost::char_separator 使用 std::isspace() 和 std::ispunct() 来识别分隔符。 Boost.Tokenizer 区分应该显示的分隔符和应该抑制的分隔符。默认情况下,空格被抑制并显示标点符号。

示例二

初始化 boost::char_separator 以适应迭代

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  boost::char_separator<char> sep{" "};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

为了防止标点符号被解释为分隔符,请在将 boost::char_separator 对象传递给分词器之前对其进行初始化。

boost::char_separator 的构造函数一共接受三个参数,但只需要第一个。第一个参数描述被抑制的各个分隔符。示例 10.2 与示例 10.1 一样,将空格视为分隔符。

第二个参数指定应显示的分隔符。如果省略此参数,则不显示分隔符,程序现在将显示 Boost、C++ 和库。

示例三

使用 boost::char_separator 模拟默认行为

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  boost::char_separator<char> sep{" ", "+"};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

如果将加号作为第二个参数传递,则示例 10.3 的行为类似于示例 10.1。

第三个参数决定是否显示空的部分表达式。如果连续找到两个分隔符,则对应的部分表达式为空。默认情况下,不显示这些空表达式。使用第三个参数,可以更改默认行为。

示例四

初始化 boost::char_separator 以显示空的部分表达式

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  boost::char_separator<char> sep{" ", "+", boost::keep_empty_tokens};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

示例 10.4 显示了两个额外的空部分表达式。第一个位于两个加号之间,而第二个位于第二个加号和后面的空格之间。

示例五

具有宽字符串的 Boost.Tokenizer

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<wchar_t>,
    std::wstring::const_iterator, std::wstring> tokenizer;
  std::wstring s = L"Boost C++ Libraries";
  boost::char_separator<wchar_t> sep{L" "};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::wcout << t << '\n';
}

Example

示例 10.5 迭代一个 std::wstring 类型的字符串。为了支持此字符串类型,必须使用附加模板参数初始化标记器。类 boost::char_separator 也必须用 wchar_t 初始化。

除了 boost::char_separator 之外,Boost.Tokenizer 还提供了两个额外的类来识别部分表达式。

示例六

使用 boost::escaped_list_separator 解析 CSV 文件

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;
  std::string s = "Boost,\"C++ Libraries\"";
  tokenizer tok{s};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

boost::escaped_list_separator 用于读取以逗号分隔的多个值。这种格式通常称为 CSV(逗号分隔值)。 boost::escaped_list_separator 还处理双引号和转义序列。因此,示例 10.6 的输出是 Boost 和 C++ 库。

提供的第二个类是 boost::offset_separator,它必须被实例化。相应的对象必须作为第二个参数传递给 boost::tokenizer 的构造函数。

示例七

使用 boost::offset_separator 迭代部分表达式

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::offset_separator> tokenizer;
  std::string s = "Boost_C++_Libraries";
  int offsets[] = {5, 5, 9};
  boost::offset_separator sep{offsets, offsets + 3};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

boost::offset_separator 指定字符串中各个部分表达式结束的位置。示例 10.7 指定第一个部分表达式在 5 个字符后结束,第二个在另外 5 个字符后结束,第三个在以下 9 个字符后结束。输出将是 Boost、_C++_ 和库。

到此这篇关于C++ Boost Tokenizer使用详细讲解的文章就介绍到这了,更多相关C++ Boost Tokenizer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言代码实现三子棋游戏

    C语言代码实现三子棋游戏

    这篇文章主要为大家详细介绍了C语言代码实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • EasyC++编写头文件

    EasyC++编写头文件

    这篇文章主要介绍了C++编写头文件,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码,感兴趣的小伙伴一起来看下面文章的详细介绍吧
    2021-12-12
  • C++实现猜牌小游戏

    C++实现猜牌小游戏

    这篇文章主要为大家详细介绍了C++实现猜牌小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++基于先序、中序遍历结果重建二叉树的方法

    C++基于先序、中序遍历结果重建二叉树的方法

    这篇文章主要介绍了C++基于先序、中序遍历结果重建二叉树的方法,结合实例形式分析了基于C++构建二叉树的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C语言详细讲解#error与#line如何使用

    C语言详细讲解#error与#line如何使用

    这篇文章主要介绍了C语言中#error与#line如何使用,#error与#line虽然在语言里面用的比较少,但是还是有必要了解一下
    2022-04-04
  • C语言植物大战数据结构快速排序图文示例

    C语言植物大战数据结构快速排序图文示例

    这篇文章主要为大家介绍了C语言植物大战数据结构快速排序图文示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言入门篇--函数及数组用法

    C语言入门篇--函数及数组用法

    本篇文章是c语言基础篇,主要为大家介绍了C语言的函数与数组,每个函数本质上都实现一个最小的功能,而main函数只负责调用函数,实现代码的核心逻辑,提高代码的可维护性
    2021-08-08
  • C++深入详解单例模式与特殊类设计的实现

    C++深入详解单例模式与特殊类设计的实现

    这篇文章主要为大家详细介绍了C++单例模式和特殊类的设计,单例模式这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-06-06
  • 基于C语言实现简单学生成绩管理系统

    基于C语言实现简单学生成绩管理系统

    这篇文章主要为大家详细介绍了基于C语言实现简单学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言数据结构不挂科指南之栈&队列&数组详解

    C语言数据结构不挂科指南之栈&队列&数组详解

    自考重点、期末考试必过指南,这篇文章让你理解什么是栈、什么是队列、什么是数组。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-09-09

最新评论