C++ Primer 5th学习笔记2 字符串、向量和数组

一、字符串、向量、数组

1 标准库类型string

  标准库类型string表示可变长的字符序列,使用时必须先包含string头文件#include <string>,文件中还需要声明using std::string;

1.1 定义和初始化string对象

eg

声明形式 描述
string s1 默认初始化,s1是一个字符串
string s2(s1) s2是s1的副本
string s2 = s1 等价于s2(s1),s2是s1的副本
string s3("value") s3是字面值“value”的副本
string s3 = value 等价于s3(“value”)
string s4(n, 'c') 把s4初始化为由连续n个字符c组成的串

拷贝初始化与直接初始化的区别:

string s5 = "hiya";		//拷贝初始化
string s6("hiya");		//直接初始化
string s7(10, 'c');		//直接初始化

Tips:带等号的为拷贝初始化,不带等号的即直接初始化

1.2 string对象上的操作

操作 描述
os << s 将s写到输出流os当中,返回os
is >> s is中读取字符串赋值给s,字符串以空白间隔,返回is
getline(is, s) is中读取一行赋值给s,返回is
s.empty() s为空返回true,否则返回false
s.size() 返回s中字符的个数
s[n] 返回s中第n个字符的引用,位置n从0开始
s1 + s2 返回s1s2连接后的结果
s1 = s2 s2的副本代替s1中原来的字符
s1 == s2 s1s2所含的字符完全一样,则两者相等
s1 != s2 等性判断对字母的大小敏感
<,<=,>,>= 利用字符在字典中的顺序进行比较,对字母的大小写敏感

比较string对象的规则:

  • 若两个string长度不同,但较短的string的每个字符串与较长的string对应位置上的字符相同,则较短的string小于较长的string对象
  • 两个string在某些对应位置上不一致,则比较结果是string中第一对相异字符的比较结果。
string str1 = "Hello";
string str2 = "Hello World";
string str3 = "Hiya";

如上例:str1小于str2,str3大于str2,str3大于str1。

string相加规则:必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string对象。

1.3 处理string对象中的字符

以下函数都包含在cctype头文件中

函数名 描述
tolower(c) 大写转小写,小写还是返回小写
toupper(c) 小写转大写,大写还是返回大写
isalnum(c) c是字母or数字为真
isalpha(c) c是字母为真
isdigit(c) c是数字为真
isspace(c) c是空白(空格、横纵制表符、回车、换行、进纸符)为真
isxdigit(c) c是十六进制数字为真

2 标准库类型vector

标准库类型vector表示对象的集合,vector也称作容器。使用时必须先包含string头文件#include <vector>,文件中还需要声明using std::vector;

2.1 定义和初始化vector对象

eg

声明形式 描述
vector<T> v1 v1是一个类型为T的空vector。
vector<T> v2(v1) v2包含v1所有元素的副本
vector<T> v2 = v1 等价于v2(v1),v2是v1的副本
vector<T> v3(n, val) v3包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n) v4包含了n个重复地执行了值初始化的对象
vector<T> v5{a,b,c...} v5包含了初始值个数的元素
vector<T> v5 = {a,b,c...} 等价于v5{a,b,c…}

2.2 vector对象上的操作

操作 描述
v.empty() 若v中不含任何元素,返回真,否则返回假
v.size() 返回v中元素的个数
v[n] 返回v中第n个位置上元素的引用
v.push_back() 返回v1v2连接后的结果
v1 = v2 v2中的元素的拷贝替换v1中的元素
v1 = {a,b,c...} 用列表中的元素拷贝替换v1中的元素
v1 == v2 v1v2相等当且仅当他们的元素数量相同且
v1 != v2 对应位置的元素值都相同
<,<=,>,>= 以字典顺序进行比较

Tip:vector对象(以及string对象)的下标运算符只能用于访问已存在的元素

扫描二维码关注公众号,回复: 5781807 查看本文章

2.3 迭代器运算符

  迭代器:所有的标准库容器都可以使用迭代器,都拥有begin和end成员,其中begin成员负责返回指向第一个元素的迭代器;end成员负责返回容器“尾元素的下一个位置”;若容器为空,则begin和end返回的是同一个迭代器

标准容器迭代器的运算符

操作 描述
*iter 返回迭代器iter所指元素的引用
iter->mem 解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem
++iter 令iter指示容器中的下一个元素
--iter 令iter指示容器中的上一个元素
iter1 == iter2 判断两个迭代器是否相等
iter1 != iter2 (主要针对同一个容器)

Tip:凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素

  • vector和string迭代器支持的运算
运算 描述
iter + n 迭代器向后移动n个位置
iter - n 迭代器向前移动n个位置
iter += n 迭代器加法的复合赋值语句
iter -= n 迭代器减法的复合赋值语句
iter1 - iter2 两个迭代器之间的距离
>、>=、<、<= 迭代器之间的关系运算

使用迭代器的经典例子------二分搜索

//text为一有序的对象
//sought表示在text中搜索的元素
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;		//初始状态下的中间点
//当还有元素未检查并且还未找到sought时执行循环
while(mid != end && *mid != sought)
{
    if(sought < *mid)		//若sought在前半部分,则此时的mid为下一次的end
    {
        end = mid;
    }
    else					//sought在后半部分,则此时的mid+1为下一次的beg
    {
        beg = mid + 1;
    }
    mid = beg + (end - beg)/2;	//新的中间点
}

Tip:此处的mid = beg + (end - beg)/2不能简写成mid = (beg + end)/2,因为迭代器不支持此运算,而且(end - beg)/2得到的是距离,beg + 距离符合iter + n的形式

3 数组

3.1 定义和初始化数组对象

  • 字符数组的特殊性
    字符数组有一种额外的初始化方式,==此处一定要注意字符串字面值的结尾处还有一个空字符,==示例如下:
char a1[] = {'C','+','+'};		//列表初始化,没有空字符
char a2[] = {'C','+','+','\0'};		//列表初始化,含有显示的空字符
char a3[] = "C++";		//自动添加表示字符串结束的空字符
const char a4[3] = "C++";		//错误:没有空间可存放空字符
  • 不允许拷贝和赋值
    不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值

  • 数组的含义
    Tip:理解数组的含义,从数组的名字开始按照由内向外的顺序阅读

  • 标准库函数begin和end
      begin和end均定义在iterator头文件中,注意尾后指针不能执行解引用和递增操作
    eg:

int a[] = {1,2,3,4,5,6,7,8,9,0};		//以拷贝的形式定义数组a
int *beg = begin(a);		//指向a首元素的指针
int *last = end(a);			//指向a尾元素的下一个位置的指针
  • 指针运算
int a[] = {1,2,3,4,5,6,7,8,9,0};		//以拷贝的形式定义数组a
int *beg = begin(a);		//指向a首元素的指针
int *last = end(a);			//指向a尾元素的下一个位置的指针
auto n = end(a) - begin(a);		//n的值为10,即a中元素的数量

两个指针相减的结果的类型是一种名为ptrdiff_t的标准库类型

int a[] = {01,2,3,4,5,6,7,8,9};		//以拷贝的形式定义数组a
int last = *(a + 4);			//定义last初始化的值等于a[4]
last = *a + 4;		//赋值last = a[0] + 4 = 4
int k = a[-2];		//a[-2]是a[0]的值

4 C标准库String函数

  下表中的函数均定义在cstring头文件中,cstring是C中的头文件string.h的cpp版本。

函数名称 描述
strlen(p) 返回p的长度,不包括空字符
strcmp(p1,p2) 比较p1p2的相等性,若相等返回0,若大于,返回一个正值;若小于,返回一个负值
strcat(p1,p2) p2附加到p1之后,返回p1
strcpy(p1,p2) p2拷贝给p1,返回p1

猜你喜欢

转载自blog.csdn.net/qq_18150255/article/details/88384168