文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++BoostTokenizer使用详细讲解

2022-11-16 00:17

关注

介绍

库 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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯