STL之string

Posted 阿呆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL之string相关的知识,希望对你有一定的参考价值。

C++ 标准库对sting的设计思路是:尽可能像基础类型,不至于在操作上引起什么麻烦。

基本的操作

a

  • substr()函数的第一个实参是起始索引值,可有可无的第二个参数是字符个数(不是终点索引),如果没有指定第二实参,那么所有的剩余字符都将被视为子字符串返回。

  • 只要以一个索引和一个长度作为参数,string的行为必须遵循下面两个准则

    • 索引值必须合法: 该值必须小于string的字符个数(第一个字符索引是0),最末字符的下一个位置的索引值可用来标明结束位置, 大部分情况下如果指定的索引超过实际字符数,会抛出out_of_rang异常。但是用于查找"单个字符或某个位置"的所有查找函数,均可接收任意索引,如果索引超过实际字符数,这些函数会返回string::npos(表示没有找到)

    • 字符数量可以为任意值: 如果其值大于剩余的字符数,所有这些剩余字符都会被用到


索引问题

string查找失败返回的是string::npos, 该值的定义为std::string::npos。当它与string比较时,应该将idx声明为std::string::size_type, 其中std::string::size_type是无符号的整型,具体是哪种无符号的整型要看具体实现。

屏幕快照 2017-04-23 下午4.06.54

另一个讨厌的问题是string的索引
a1


STL 的实参体制

STL 提供了很多字符串操作函数,其中许多往往具有数个重载版本,分别以一个、两个、三个实参来指定新值。

屏幕快照 2017-04-23 下午4.28.40
屏幕快照 2017-04-23 下午4.47.07

  • 只有单实参的const char* 版本才将字符\'\\0\' 视为string的结尾特殊字符,其他的所有情况下\'\\0\' 都不被视为特殊字符, 上图中s2("nico",6)时,只在o后面加一个\'\\0\', \'\\0\' 后面的内容就是不确定的了

  • 一般而言,string可以包含任何字符,甚至包含二进制文件

  • 把一个nullptr传给cstr(c风格字符串),会导致不明确的行为


构造函数与析构函数

  • 不能以一个单一字符初始化某字符串,但是可以按照下面的方式做: 屏幕快照 2017-04-23 下午4.54.25

屏幕快照 2017-04-23 下午4.59.21


string与c-string

C++ 标准将字符串字面常量的类型由char * 改为const char *。为了提供向后兼容性,它提供了一个颇具争议的隐式转换——const char * 隐式转换为char *。

屏幕快照 2017-04-23 下午5.06.28

  • c_str()可以得到string对应的c-string,所得的结果和以\'\\0\'结尾的字符数组一样

  • data()的效果和c_str()的效果一样

  • copy()是将string内容复制到“调用者提供的字符数组”中,其末尾不加\'\\0\'


大小和容量

屏幕快照 2017-04-24 上午10.49.58
屏幕快照 2017-04-24 上午10.50.31

以上是关于STL之string的主要内容,如果未能解决你的问题,请参考以下文章

STL---string

C++初阶:STL —— stringstring类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现

C++初阶:STL —— stringstring类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现

STL--线性容器 string

STL----map

C++ 提高教程 STL-字符串对比