目录
命名空间
标准库string
1. 定义和初始化string
2. string对象中操作
3. 处理string中字符
标准库vector
1. 定义和初始化vector对象
2. 添加元素
3. 其他vector操作
迭代器介绍
1. 使用迭代器
2. 迭代器运算
数组
1. 定义和初始化内置数组
2. 访问数组元素
3. 指针和数组
4. c风格字符串
5. 多维数组
前面用到库函数的时候都会带上其命名空间,如std::cout,表示从std命名空间中的cout函数,但是这种方式会很繁琐,一种简单的声明方式:
using namespace::name
有了声明后就无需每次使用库函数name都在前面加namespace了。
注意:using声明不放在头文件中,因为头文件可能会被拷贝到其他引用的文件中(#include),此时容易引发命名冲突。
五种方式:
string s1;//默认初始化,空串
string s2 = s1;//拷贝初始化,s2为s1的副本
string s3(s1);//直接初始化,为s1的副本
string s4 = "Hello World!";//等于字面值字符串,除了最后的空
string s5("Hello World!");//等于s4
string s6(n,'c');//s6由n个'c'组成
如果使用的等号,则为拷贝初始化,其他则为直接初始化。当初始值只有一个时,可以两种方式都可以,但是当多个值时如s6,则只能直接初始化。
os<写s到输出流os,返回os |
|
is>>s | 从输入流is中读字符串赋值给s,空白分隔,返回is |
getline(is,s) | 从输入流is中读取一行复制给s,返回is |
s.empty() | s为空返回true |
s.size() | 返回s大小,及字符个数 |
s[n] | 下标运算,返回s的第n个字符的引用,n从0开始 |
s1+s2 | 返回s1和s2连接的结果 |
s1=s2 | 用s2的副本代替s1原来内容 |
s1 == s2 | s1和s2相等返回true |
s1 != s2 | s1和s2不相等返回true |
<,<=,>,>= | 比较 |
读取时会自动忽略空白符(空格符,制表符,换行符),从第一个真正的字符开始读起,并直到遇到空白为止。(输出不会)
s.size()返回的类型是string::size_type,为无符号类型,且能够放下足够大小的string对象。注意在使用s.size()后不要用int型进行比较。
string比较:
字符串与字面值相加,注意两字符串字面值不可相加,(也可以理解为+号两侧至少有一个string对象,不过需要根据实际来判断)
string s1;
string s2 = s1 + "hello" + "world";
string s3 = "hello" + "world" + s1;//错误
s2其实根据结合律等价于
string s2 = (s1 + "hello") + "world";
所以没有两字符串字面值相加情况。
注意:C++中字符串字面值与string对象是不同的类型。
可以对string类型中的字符进行判断、处理等操作。
isalnum(c) | 是字母或数字为真 |
isalpha(c) | 是字母为真 |
iscntrl(c) | 是控制字符为真 |
isdigit(c) | 是数字为真 |
isgraph(c) | 不是空白但可打印为真 |
islower(c) | 是小写字母为真 |
isupper(c) | 是大写字母为真 |
isprint(c) | 可以打印为真(c为空格或具可视形式) |
ispunct(c) | 是标点符号为真 |
isspace(c) | 是空白为真(空格,制表,换行,回车) |
isxdigit(c) | 是十六进制为真 |
tolower(c) | 转为小写字母 |
toupper(c) | 转为大写字母 |
注意:以上为对单个字符进行操作,所以要对整个string进行遍历。
遍历可以使用两种方式。
范围for语句。
for(declaration:expression)
statement
string str = "Hello World";
for(auto c:str)
{
std::cout << c.toupper;
}
下标。下标运算符([ ]) 。注意使用下标时一定注意不要溢出。即下标值必须大于0,小于字符串的size()。
string str = "Hello world";
for(int i=0; i
vector |
空vector,类型为T |
vector |
v2是v1副本,拷贝所有v1的元素 |
vector |
v3是v1副本,拷贝所有v1的元素 |
vector |
v4含有n个元素,每个元素执行默认初始化 |
vector |
v5有n个重复元素,值为val |
vector |
v6包含{}内所有元素 |
vector |
等同于v6 |
注意:花括号优先列表初始化,如果无法进行列表初始化,则转为直接初始化(类似小括号),而小括号则为直接初始化。
vector v1(10);//10个元素,每个元素默认初始化
vector v2{10};//一个元素10
vector v3{10};//无法列表初始化,直接初始化为10个元素,每个元素默认初始化
vector v4{10,"hi"};//无法列表初始化,直接初始化为10个元素,每个元素为"hi"
push_back.向容器尾添加一个元素。注意不要在遍历容器的循环体内执行,否则会出现无线循环。
v.empty() | v为空返回true |
v.size() | 返回v大小,及字符个数 |
v[n] | 下标运算,返回s的第n个字符的引用,n从0开始 |
v.push_back(t) | 将t加到v末尾 |
v1=v2 | 用v2的副本代替v1原来内容 |
v={a,b,c...} | 用{}内容替换v的内容 |
v1 == v2 | v1和v2相等返回true |
v1 != v2 | v1和v2不相等返回true |
<,<=,>,>= | 比较 |
迭代器就是用来访问string和vector等对象的元素。
和指针不同,迭代器不需要取址,一般由成员函数获得,如begin和end。begin返回指向第一个元素的迭代器,end返回指向最后一个元素后的迭代器,也称“尾后”迭代器,是无效的,不可以访问的。
*iter | 返回迭代器所指元素的引用 |
iter->mem | 访问iter的成员mem |
++iter | 向后移动一个位置 |
--iter | 向前移动一个位置 |
iter1 == iter2 | 判断两个迭代器是否相等,如果他们指示这同一个元素或同一个容器的尾后迭代器,则相等 |
iter != iter2 |
迭代器类型
和size_type成员一样,会在前带上类型名。迭代器拥有iterator和const_iterator两种
vector::iterator it;
vector::const_iterator it2;
vector::iterator it3;
vector::const_iterator it4;
iter + n | 返回一个向前移动n位置的迭代器 |
iter - n | 返回一个向后移动n位置的迭代器 |
iter += n | iter向后移动n位置 |
iter -=n | iter向前移动n位置 |
iter1 - iter2 | 得到两者的距离,类型为deifferent_type |
>、<、>=、<= | 参与运算的迭代器必须是同一容器 |
类似于vector的数据结构,但是因为大小固定,所以对于某些特定的程序运行性能更好,但是灵活行会差一点。
因为数组的大小是固定的,所以初始化时维度必须是常量表达式。
定义数组时必须指定数组类型,不可以使用auto获取类型。
另外,数组不是一个对象,所以不存在数组的引用。
显示初始化数组
列表初始化时可以忽略维度,编译器会根据列表元素推测数组维度。
如果规定了维度,在初始化时元素个数不应大于数组维度。小于时,会初始化数组前面元素。剩下元素被默认初始化。
int a[] = {3,4};//a两个元素,分别为3,4
int a2[5] = {1,2,3};//5个元素,1,2,3,0,0
int a3[2] = {1,2,3};//错误,数据过长
字符数组的特殊性
使用字符串字面值初始化字符数组时,需要注意,字符串字面值有个空字符。所以长度注意不要溢出。
不允许赋值和拷贝
数组不允许赋值给另外一个数组。但是可以用数组的值为其他数组初始化。
理解复杂数组的声明
数组的声明可以从内往外看。
int *p[10];//p是含有10个int *元素的指针
int (*p)[10];//p是一个指针,指向含有10个int型元素的数组
int (&r)[10] = arr;//r引用一个含有10个int型元素的数组
int &r[10] = arr;//错误
使用下标方式。
数组名表示一个指向数组第一个元素的指针。
所以使用auto作用一个数组名时,获得的是一个指针类型。而decltype则不会发生上述的转变。
只要指针指向的是数组中的元素,都可以执行下标运算,且下标值为int(可为负数)
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = a;
int i = *(p+1);
int j = p[1];
int k = p[-9];//i,j,k得到的都是2,也就是说三种运算方式只想数组a的同一个元素
字符串字面值,放入字符数组中会以空字符结束,一般使用指针来操作这些字符串。
strlen(p) | 返回p的长度,空字符不算在内 |
strcmp(p1,p2) | 相等返回0,大于返回正值,小于返回负值 |
strcat(p1,p2) | p2连接到p1后,返回p1 |
strcpy(p1,p2) | p2拷贝给p1,返回p1 |
传入此类库函数的指针必须指向以空字符串结束的字符数组。
与数组类似,表示每个数组的元素都是包含一个下一层数组大小的数组。指针也是。