一、字符串、向量、数组
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 | 返回s1 和s2 连接后的结果 |
s1 = s2 | 用s2 的副本代替s1 中原来的字符 |
s1 == s2 | 若s1 和s2 所含的字符完全一样,则两者相等 |
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() | 返回v1 和v2 连接后的结果 |
v1 = v2 | 用v2 中的元素的拷贝替换v1 中的元素 |
v1 = {a,b,c...} | 用列表中的元素拷贝替换v1中的元素 |
v1 == v2 | v1 和v2 相等当且仅当他们的元素数量相同且 |
v1 != v2 | 对应位置的元素值都相同 |
<,<=,>,>= | 以字典顺序进行比较 |
Tip:vector对象(以及string对象)的下标运算符只能用于访问已存在的元素
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[] = {0,1,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) | 比较p1 和p2 的相等性,若相等返回0,若大于,返回一个正值;若小于,返回一个负值 |
strcat(p1,p2) | 将p2 附加到p1 之后,返回p1 |
strcpy(p1,p2) | 将p2 拷贝给p1 ,返回p1 |