自学内容网 自学内容网

【C++】顺序容器(四):额外的string操作

9.5 额外的 string 操作

除了之前文章当中分享的顺序容器的共同操作,string 类型还提供了一些额外的操作。

这些操作中的大部分:

  • 要么是提供 string 类和 C 风格字符数组之前的相互转换;
  • 要么是增加了允许我们用下标代替迭代器的版本;

9.5.1 构造 string 的其它方法

string 类型还支持额外三个构造函数:

  • string s(cp, n):s 是 cp 指向的数组中前 n 个字符的拷贝。此数组应至少包含 n 个字符;
  • string s(s2, pos2):s 是 string s2 从下标 pos2 开始的字符的拷贝。若 pos2 > s2.size(),构造函数的行为未定义;
  • string s(s2, pos2, len2):s 是 string 对象 s2 从下标 pos2 开始 len2 个字符的拷贝。

substr 操作

substr 操作返回一个 string,它是原始 string 的一部分或全部的拷贝。用法如下:

  • s.substr(pos, n):返回一个 string,包含 s 从 pos 开始的 n 个字符的拷贝。pos 的默认值是 0。n 的默认值是 s.size() - pos,即拷贝从 pos 开始的所有字符。

9.5.2 改变 string 的其他方法

string 类型支持顺序容器的赋值运算符以及 assign、insert 和 erase 操作。此外,它还定义了额外的 insert 和 erase 版本。

标准库的 string 类型还提供了接;受 C 风格字符数组的 insert 和 assign 版本。例如,我们可以将以空字符结尾的字符数组 insert 到或 assign 给一个 string:

const char *cp = "test for string assignment";
s.assign(cp, 7);// s == "test fo"
s.insert(s.size(), cp + 7);// s == "test for string assignment"

append 和 replace 函数

string 类定义了两个额外的成员函数:append 和 replace,这两个函数可以改变 string 的内容。

  • append 操作是在 string 末尾进行插入操作的一种简写形式;
  • replace 操作是调用 erase 和 insert 的一种简写形式;

append 操作的一个例子如下:

string s("C++ Primer"), s2 = s;
s.insert(s.size(), " 4th Ed.");// s == "C++ Primer 4th Ed."
s2.append("4th Ed.");// s == "C++ Primer 4th Ed."

需要注意的是,append 操作执行插入的位置仅在调用该成员的 string 对象的末尾。

replace 操作是调用 erase 和 insert 的一种简写形式:

s.erase(11, 3);// s == "C++ Primer Ed.:" 删除了上例 s 中的 4th Ed.
s.inseert(11, "5th");// s == "C++ Primer 5th Ed."
s2.replace(11, 3, "5th");// s2 == "C++ Primer 5th Ed."

在上述 replace 的调用中,s2 从位置 11 开始删除了包括第十一个字符(4)在内的三个字符(4th),并在 11 位置插入 5th。

改变 string 的多种重载函数

改变 string 的函数 append、assign、replace等有多个重载的版本。

9.5.3 string 搜索操作

string 类提供了 6 个不同的搜索函数,每个函数都有 4 个重载版本。

string 搜索操作如下:

  • s.find(args):查找 s 中 args 第一次出现的位置;
  • s.rfind(args):查找 s 中 args 最后一次出现的位置;
  • s.find_first_of(args):在 s 中查找 args 中任何一个字符第一次出现的位置;
  • s.find_last_of(args):在 s 中查找 args 中任何一个字符最后一次出现的位置;
  • s.find_first_not_of(args):在 s 中查找第一个不在 args 中的字符;
  • s.find_last_not_of(args):在 s 中查找最后一个不在 args 中的字符;

args 必须是以下形式之一:

  • c, pos:从 s 中位置 pos 开始查找字符 c,pos 默认为 0;
  • s2, pos:从 s 中位置 pos 开始查找字符串 s2,pos 默认为 0;
  • cp, pos:从 s 中位置 pos 开始查找指针 cp 指向的以空字符结尾的 C 风格字符串。pos 默认为 0;
  • cp, pos, n:从 s 中位置 pos 开始查找指针 cp 指向的数组的前 n 个字符。pos 和 n 无默认值0;

每个搜索操作返回一个 string::size_type 值,表示匹配发生位置的下标。如果搜索失败,返回一个名为 string::npos 的 static 成员。标准库将 npos 定义为一个 const string::size_type 类型,并初始化为值 -1。

指定从哪里开始搜索

通过指定 args 当中的参数 pos 来完成。默认值为 0,表示从头开始搜索。

逆向搜索

标准库的 rfind 提供了从右向左对字符串进行搜索的功能。

9.5.4 compare 函数

除了关系运算符外,标准库 string 类型还提供了一组 compare 函数,这些函数类似于 C 标准库当中的 strcmp 函数。

9.5.5 数值转换

C++ 11 标准引入了多个函数,可以实现数值数据与标准库 string 之间的转换

  • to_string(val):一组重载函数,返回数值 val 的 string 表示;
  • stoi(s, p, b):返回 s 的起始子串的数值;
  • stol(s, p, b);
  • stoul(s, p, b);
  • stoll(s, p, b);
  • stoull(s, p, b);
  • stof(s, p):返回 s 的起始子串的数值;
  • stod(s, p);
  • stold(s, p);

从上表中可以看到,C++ 11 标准提供了一组重载函数 to_string 来将数值转换为 string 对象,而针对多种不同类型的数值,分别根据类型提供了对象的字符串 string 转数值操作。


原文地址:https://blog.csdn.net/Coffeemaker88/article/details/144069904

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!