C++ Boost StringAlgorithms超详细讲解

目录
  • 一、提要
  • 二、简化字符串处理的工具和其库
  • 三、应用Boost.StringAlgrithms库
    • 3.1 字符大小写
    • 3.2 删除字符串内子串
    • 3.3 查找字符串内子串
    • 3.4 合并字符串
    • 3.5 子串替换
    • 3.6 字符串修剪
    • 3.7 创立谓词
    • 3.8 比较
    • 3.9 拆分字符串
    • 3.10 查找字符串
  • 练习

一、提要

boost C++对应的字符串对象也有一套标准操作方法。本文介绍库Boost.StringAlgorithms的若干函数和功能示例。

二、简化字符串处理的工具和其库

  • Boost.StringAlgorithms 定义了许多专门针对字符串的算法。例如,您会找到将字符串转换为小写或大写的算法。
  • Boost.LexicalCast 提供了一个转换运算符来将数字转换为字符串,反之亦然。该库在内部使用字符串流,但可能针对某些类型之间的转换进行了优化。
  • Boost.Format 为 std::printf() 提供了一个类型安全的替代方案。像 Boost.LexicalCast 一样,这个库在内部使用字符串流。如果定义了输出流操作符,Boost.Format 是可扩展的并且支持用户定义的类型。
  • Boost.Regex 和 Boost.Xpressive 是使用正则表达式在字符串中搜索的库。虽然 Boost.Regex 期望将正则表达式写成字符串,但 Boost.Xpressive 允许您将它们写成 C++ 代码。
  • Boost.Tokenizer 使得迭代字符串中的子字符串成为可能。
  • Boost.Spirit 可用于开发基于类似于 Extended Backus-Naur-Form 规则的解析器。

三、应用Boost.StringAlgrithms库

Boost.StringAlgorithms 库为字符串操作提供了许多独立的函数。字符串的类型可以是 std::string、std::wstring 或类模板 std::basic_string 的任何其他实例。这包括 C++11 引入的字符串类 std::u16string 和 std::u32string。

这些函数被分类在不同的头文件中。例如,从大写转换为小写的函数在 boost/algorithm/string/case_conv.hpp 中定义。因为 Boost.StringAlgorithms 包含 20 多个不同的类别和尽可能多的头文件,为了方便起见,boost/algorithm/string.hpp 充当通用头文件,包括所有其他头文件。

3.1 字符大小写

示例1.将字符转化成大写(to_upper_copy)

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  std::cout << to_upper_copy(s) << '\n';
}

函数 boost::algorithm::to_upper_copy() 将字符串转换为大写,boost::algorithm::to_lower_copy() 将字符串转换为小写。这两个函数都返回输入字符串的副本,转换为指定的大小写。要就地转换字符串,请使用函数 boost::algorithm::to_upper() 或 boost::algorithm::to_lower()。

示例 1 使用 boost::algorithm::to_upper_copy() 将字符串“Boost C++ Libraries”转换为大写。该示例将 BOOST C++ LIBRARIES 写入标准输出。

Boost.StringAlgorithms 中的函数会考虑语言环境。如果没有将语言环境作为参数显式传递,则诸如 boost::algorithm::to_upper_copy() 之类的函数会使用全局语言环境。

示例2.使用语言环境将字符串转换为大写

#include <boost/algorithm/string.hpp>
#include <string>
#include <locale>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ k\xfct\xfcphaneleri";
  std::string upper_case1 = to_upper_copy(s);
  std::string upper_case2 = to_upper_copy(s, std::locale{"Turkish"});
  std::locale::global(std::locale{"Turkish"});
  std::cout << upper_case1 << '\n';
  std::cout << upper_case2 << '\n';
}

示例 2 调用 boost::algorithm::to_upper_copy() 两次以将土耳其语字符串“Boost C++ kütüphaneleri”转换为大写。第一次调用 boost::algorithm::to_upper_copy() 使用全局语言环境,在本例中为 C 语言环境。在 C 语言环境中,带有变音符号的字符没有大写映射,因此输出将如下所示:BOOST C++ KüTüPHANELERI。

土耳其语语言环境被传递给对 boost::algorithm::to_upper_copy() 的第二次调用。由于此语言环境确实具有变音符号的大写等效项,因此可以将整个字符串转换为大写。因此,对 boost::algorithm::to_upper_copy() 的第二次调用正确地转换了字符串,如下所示:BOOST C++ KÜTÜPHANELERI。

注意:

如果您想在 POSIX 操作系统上运行示例,请将“Turkish”替换为“tr_TR”,并确保安装了土耳其语区域设置。

3.2 删除字符串内子串

示例3.从字符串中删除字符的算法

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  std::cout << erase_first_copy(s, "s") << '\n';
  std::cout << erase_nth_copy(s, "s", 0) << '\n';
  std::cout << erase_last_copy(s, "s") << '\n';
  std::cout << erase_all_copy(s, "s") << '\n';
  std::cout << erase_head_copy(s, 5) << '\n';
  std::cout << erase_tail_copy(s, 9) << '\n';
}

Boost.StringAlgorithms 提供了几个函数,可用于从字符串中删除单个字符(参见示例 3)。例如, boost::algorithm::erase_all_copy() 将从字符串中删除所有出现的特定字符。要仅删除第一次出现的字符,请改用 boost::algorithm::erase_first_copy()。要在任一端将字符串缩短特定数量的字符,请使用函数 boost::algorithm::erase_head_copy() 和 boost::algorithm::erase_tail_copy()。

3.3 查找字符串内子串

示例4. 查找字串boost::algorithm::find_first()

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  boost::iterator_range<std::string::iterator> r = find_first(s, "C++");
  std::cout << r << '\n';
  r = find_first(s, "xyz");
  std::cout << r << '\n';
}

函数如 boost::algorithm::find_first()、boost::algorithm::find_last()、boost::algorithm::find_nth()、boost::algorithm::find_head() 和 boost::algorithm::find_tail () 可用于在字符串中查找字符串。

所有这些函数都返回一对 boost::iterator_range 类型的迭代器。这个类源自Boost.Range,它实现了基于迭代器概念的范围概念。由于运算符 operator<< 为 boost::iterator_range 重载,因此单个搜索算法的结果可以直接写入标准输出。示例 4 为第一个结果打印 C++,为第二个结果打印一个空字符串。

3.4 合并字符串

示例.5. 合并字符串boost::algorithm::join()

#include <boost/algorithm/string.hpp>
#include <string>
#include <vector>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::vector<std::string> v{"Boost", "C++", "Libraries"};
  std::cout << join(v, " ") << '\n';
}

字符串容器作为第一个参数传递给函数 boost::algorithm::join(),该函数将它们连接起来,由第二个参数分隔。示例 5.5 将输出 Boost C++ 库。

3.5 子串替换

示例6.替换字符串中字符的算法

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  std::cout << replace_first_copy(s, "+", "-") << '\n';
  std::cout << replace_nth_copy(s, "+", 0, "-") << '\n';
  std::cout << replace_last_copy(s, "+", "-") << '\n';
  std::cout << replace_all_copy(s, "+", "-") << '\n';
  std::cout << replace_head_copy(s, 5, "BOOST") << '\n';
  std::cout << replace_tail_copy(s, 9, "LIBRARIES") << '\n';
}

与搜索字符串或从字符串中删除字符的函数一样,Boost.StringAlgorithms 也提供了替换字符串中的子字符串的函数。其中包括以下函数:boost::algorithm::replace_first_copy()、boost::algorithm::replace_nth_copy()、boost::algorithm::replace_last_copy()、boost::algorithm::replace_all_copy()、boost::algorithm ::replace_head_copy() 和 boost::algorithm::replace_tail_copy()。它们可以以与搜索和删除函数相同的方式应用,除了它们需要一个额外的参数 - 替换字符串(参见示例 6)。

3.6 字符串修剪

示例7.修剪字符串的算法

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "\t Boost C++ Libraries \t";
  std::cout << "_" << trim_left_copy(s) << "_\n";
  std::cout << "_" << trim_right_copy(s) << "_\n";
  std::cout << "_" << trim_copy(s) << "_\n";
}

要删除字符串两端的空格,请使用 boost::algorithm::trim_left_copy()、boost::algorithm::trim_right_copy() 和 boost::algorithm::trim_copy()(参见示例 5.7)。全局语言环境确定哪些字符被视为空格。

Boost.StringAlgorithms 允许您提供谓词作为不同函数的附加参数,以确定函数应用于字符串的哪些字符。带有谓词的版本是:boost::algorithm::trim_right_copy_if()、boost::algorithm::trim_left_copy_if() 和 boost::algorithm::trim_copy_if()。

3.7 创立谓词

示例8.创建谓词1is_any_of

boost::algorithm::is_any_of()

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "--Boost C++ Libraries--";
  std::cout << trim_left_copy_if(s, is_any_of("-")) << '\n';
  std::cout << trim_right_copy_if(s, is_any_of("-")) << '\n';
  std::cout << trim_copy_if(s, is_any_of("-")) << '\n';
}

示例 8 使用另一个名为 boost::algorithm::is_any_of() 的函数,它是一个辅助函数,用于创建一个谓词,用于检查某个字符(作为参数传递给 is_any_of() )是否存在于字符串中。使用 boost::algorithm::is_any_of(),可以指定修剪字符串的字符。示例 5.8 使用连字符。

Boost.StringAlgorithms 提供了许多返回常用谓词的辅助函数。

示例9.创建谓词2(is_digit() )

boost::algorithm::is_digit()

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "123456789Boost C++ Libraries123456789";
  std::cout << trim_left_copy_if(s, is_digit()) << '\n';
  std::cout << trim_right_copy_if(s, is_digit()) << '\n';
  std::cout << trim_copy_if(s, is_digit()) << '\n';
}

boost::algorithm::is_digit() 返回的谓词测试字符是否为数字。在示例9 中,boost::algorithm::is_digit() 用于从字符串 s 中删除数字。

Boost.StringAlgorithms 还提供了辅助函数来检查字符是大写还是小写:boost::algorithm::is_upper() 和 boost::algorithm::is_lower()。默认情况下,所有这些函数都使用全局语言环境,除非您将不同的语言环境作为参数传递。

除了验证字符串的单个字符的谓词之外,Boost.StringAlgorithms 还提供了可以处理字符串的函数(参见示例 10)。

3.8 比较

示例10.字符串的比较

#include <boost/algorithm/string.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  std::cout.setf(std::ios::boolalpha);
  std::cout << starts_with(s, "Boost") << '\n';
  std::cout << ends_with(s, "Libraries") << '\n';
  std::cout << contains(s, "C++") << '\n';
  std::cout << lexicographical_compare(s, "Boost") << '\n';
}

boost::algorithm::starts_with()、boost::algorithm::ends_with()、boost::algorithm::contains() 和 boost::algorithm::lexicographical_compare() 函数比较两个单独的字符串。示例 11 引入了一个将字符串拆分为较小部分的函数。

3.9 拆分字符串

示例 11.拆分字符串boost::algorithm::split()

#include <boost/algorithm/string.hpp>
#include <string>
#include <vector>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  std::vector<std::string> v;
  split(v, s, is_space());
  std::cout << v.size() << '\n';
}

使用 boost::algorithm::split(),可以根据分隔符拆分给定的字符串。子字符串存储在容器中。该函数需要一个谓词作为其第三个参数,该谓词测试每个字符并检查字符串是否应在给定位置拆分。示例 5.11 使用辅助函数 boost::algorithm::is_space() 创建一个谓词,在每个空格字符处分割字符串。

本章介绍的许多函数都有忽略字符串大小写的版本。这些版本通常具有相同的名称,但前导“i”除外。例如,boost::algorithm::erase_all_copy() 的等效函数是 boost::algorithm::ierase_all_copy()。

最后,Boost.StringAlgorithms 的很多函数也支持正则表达式。示例 5.12 使用函数 boost::algorithm::find_regex() 来搜索正则表达式。

3.10 查找字符串

示例12.字符串查找boost::algorithm::find_regex()

#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/regex.hpp>
#include <string>
#include <iostream>
using namespace boost::algorithm;
int main()
{
  std::string s = "Boost C++ Libraries";
  boost::iterator_range<std::string::iterator> r =
    find_regex(s, boost::regex{"\\w\\+\\+"});
  std::cout << r << '\n';
}

为了使用正则表达式,程序会访问一个名为 boost::regex 的类,该类将在第 8 章中介绍。

示例 12 将 C++ 写入标准输出。

练习

创建一个程序,要求用户输入他的全名。程序应该用“Hello”来问候用户,然后是用户名和感叹号。用户的名字和姓氏应以大写字母开头,后跟小写字母。此外,用户的名字和姓氏应该用一个空格隔开。感叹号前不能有空格。

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

(0)

相关推荐

  • C++ Boost ScopeExit超详细讲解

    目录 一.提要 二.退出作用域(Boost.ScopeExit) 2.1 范例1.UsingBOOST_SCOPE_EXIT 2.2 示例2.Boost.ScopeExit和C++11的lambda函数 2.3 示例3.特点BOOST_SCOPE_EXIT 三.练习 一.提要 资源有很多种,每种都封装一套,还是挺繁琐的!对于比较少使用或者一个程序很可能只会用一次的资源,我们不想封装,在这种情况下用Boost.ScopeExit. 二.退出作用域(Boost.ScopeExit) 库 Boost.

  • C++ boost scoped_ptr智能指针详解

    目录 一.智能指针-唯一所有者 二.接口类分析 一.智能指针-唯一所有者 boost::scoped_ptr 是一个智能指针,它是动态分配对象的唯一所有者. boost::scoped_ptr 无法复制或移动.此智能指针在头文件 boost/scoped_ptr.hpp 中定义. 二.接口类分析 scoped_array 分析 scoped_array 的类部分原始代码如下: template<class T> class scoped_array // noncopyable { priva

  • C++ Boost PointerContainer智能指针详解

    目录 一.提要 二.智能指针Boost.PointerContainer 三.练习 一.提要 在 C++11 中,Boost.PointerContainer是另一个智能指针,一般是用来生成集合数据的,本文阐述这种指针的特点和用法. 二.智能指针Boost.PointerContainer 库 Boost.PointerContainer 提供专门用于管理动态分配对象的容器.例如,在 C++11 中,您可以使用 std::vector<std::unique_ptr<int>> 创

  • C++ Boost shared_ptr共享指针详细讲解

    目录 一.提要 二.智能指针boost::shared_ptr与boost::scoped_ptr 三.智能指针 boost::shared_ptr用法 示例1 示例2 示例3 示例4 示例5 一.提要 boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别. 二.智能指针boost::shared_ptr与boost::scoped_ptr 主要区别在于: boost::shared_ptr 不一定是对象的独占所有者. 所有权可以

  • C++ Boost weak_ptr智能指针超详细讲解

    目录 一.提要 二.特别智能指针(Special Smart Pointers) 一.提要 在 C++11 中,boost::weak_ptr是另一类智能指针,一般是用COM组件生成.调用,本文阐述这种指针的特点和用法. 二.特别智能指针(Special Smart Pointers) 到目前为止介绍的每个智能指针都可以在不同的场景中单独使用.但是,boost::weak_ptr 仅在与 boost::shared_ptr 结合使用时才有意义. boost::weak_ptr 在 boost/w

  • C++ Boost实现数字与字符串转化详解

    目录 一.引言 二.Boost.LexicalCast 2.1 示例1 2.2 示例2 三.lexical_cast与c/c++提供类似接口的比较 3.1 两者比较 3.2 样例 一.引言 在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换.本文介绍这种用法的案例. 二.Boost.LexicalCast Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或

  • C++ Boost Thread线程使用示例详解

    目录 一.并行编程 二.生成何管理Threads 练习 一.并行编程 以下库支持并行编程模型. Boost.Thread 允许您创建和管理自己的线程. Boost.Atomic 允许您通过多个线程的原子操作访问整数类型的变量. Boost.Lockfree 提供线程安全的容器. Boost.MPI 起源于超级计算机领域.使用 Boost.MPI,您的程序可以多次启动并在多个进程中执行.您专注于对应该并发执行的实际任务进行编程,而 Boost.MPI 会协调这些过程.使用 Boost.MPI,您无

  • C++ Boost Lockfree超详细讲解使用方法

    目录 一.说明 二.示例和代码 Boost.Lockfree 一.说明 Boost.Lockfree 提供线程安全和无锁容器.可以从多个线程访问此库中的容器,而无需同步访问. 在 1.56.0 版本中,Boost.Lockfree 只提供了两个容器:boost::lockfree::queue 类型的队列和 boost::lockfree::stack 类型的栈.对于队列,可以使用第二个实现:boost::lockfree::spsc_queue.此类针对只有一个线程写入队列和只有一个线程从队列

  • C++ Boost System超详细讲解

    目录 一.说明 二.关于 Boost.System库 一.说明 以下库支持错误处理. Boost.System 提供类来描述和识别错误.自 C++11 以来,这些类已成为标准库的一部分. Boost.Exception 使得在抛出异常后附加数据成为可能. 二.关于 Boost.System库 Boost.System Boost.System 是一个库,本质上定义了四个类来识别错误.所有四个类都已添加到 C++11 的标准库中.如果您的开发环境支持 C++11,则无需使用 Boost.Syste

  • C++ Boost Uuid超详细讲解

    目录 一.说明 二.Boost.Uuid库示例和代码 一.说明 Boost.Uuid 为 UUID 提供生成器. UUID 是不依赖于中央协调实例的通用唯一标识符.例如,没有数据库存储所有生成的 UUID,可以检查这些 UUID 是否使用了新的 UUID. UUID 由必须唯一标识组件的分布式系统使用.例如,Microsoft 使用 UUID 来识别 COM 世界中的接口.对于为 COM 开发的新接口,可以轻松分配唯一标识符. UUID 是 128 位数字.存在多种生成 UUID 的方法.例如,

  • C++ Boost Archive超详细讲解

    目录 一.说明 二.关于Archive库 一.说明 对Boost.Serialization库的应用,存在如下内容: Archive Pointers and References Serialization of Class Hierarchy Objects Wrapper Functions for Optimization Boost.Serialization 库可以将 C++ 程序中的对象转换为可以保存和加载以恢复对象的字节序列.有不同的数据格式可用于定义生成字节序列的规则. Boo

  • C++ Boost ProgramOptions超详细讲解

    目录 一.说明 二.示例Boost.ProgramOptions 一.说明 Boost.ProgramOptions Boost.ProgramOptions 是一个可以轻松解析命令行选项的库,例如,控制台应用程序.如果您使用图形用户界面开发应用程序,命令行选项通常并不重要. 要使用 Boost.ProgramOptions 解析命令行选项,需要以下三个步骤: 定义命令行选项.您给它们命名并指定哪些可以设置为一个值.如果命令行选项被解析为键/值对,您还可以设置值的类型——例如,它是字符串还是数字

  • C++ Boost Utility超详细讲解

    目录 一.说明 二.Boost.Utility库示例和代码 一.说明 Boost.Utility 库是杂项.有用的类和函数的集合,它们太小而无法在独立库中维护.虽然实用程序很小并且可以快速学习,但它们完全无关.与其他章节中的示例不同,此处的代码示例不是相互构建的,因为它们是独立的实用程序. 虽然大多数实用程序都在 boost/utility.hpp 中定义,但有些实用程序有自己的头文件.以下示例包括所介绍的实用程序的相应头文件. 二.Boost.Utility库示例和代码 示例 69.1.使用

  • C++ Boost Assign超详细讲解

    目录 说明 Exercise 说明 Boost.Assign Boost.Assign 库提供了帮助函数来初始化容器或向容器添加元素.如果需要将许多元素存储在一个容器中,这些函数尤其有用.多亏了 Boost.Assign 提供的函数,您不需要重复调​​用像 push_back() 这样的成员函数来将元素一个一个地插入到容器中. 如果您使用支持 C++11 的开发环境,则可以从初始化列表中获益.通常您可以将任意数量的值传递给构造函数来初始化容器.多亏了初始化列表,你不必依赖 C++11 的 Boo

  • C++ Boost Format超详细讲解

    Boost.Format Boost.Format 提供了函数 std::printf() 的替代品. std::printf() 源自 C 标准并允许格式化数据输出.但是,它既不是类型安全的,也不是可扩展的. Boost.Format 提供了一种类型安全且可扩展的替代方案. Boost.Format 提供了一个名为 boost::format 的类,该类在 boost/format.hpp 中定义.与 std::printf() 类似,将包含用于控制格式的特殊字符的字符串传递给 boost::

  • C++ Boost Exception超详细讲解

    Boost.Exception 库提供了一种新的异常类型 boost::exception,它允许您在抛出异常后将数据添加到异常中.此类型在 boost/exception/exception.hpp 中定义.由于 Boost.Exception 将其类和函数分布在多个头文件中,以下示例访问主头文件 boost/exception/all.hpp 以避免一个接一个地包含头文件. Boost.Exception 支持 C++11 标准的机制,该机制将异常从一个线程传输到另一个线程. boost::

随机推荐