以下为vector容器相关:
- vector能够容纳大多数类型的对象作为元素,除了引用,因为引用不是对象。甚至组成vector的元素也可以是vector。
- vector初始化
vector<T> v1 | v1是一个空vector,潜在元素类型为T,执行默认初始化 |
vector<T> v2(v1) | v2中包含有v1中所有元素的副本 |
vector<T> 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> v6={a,b,c…} | 等价于上一个 |
- 还可以通过列表初始化,举例如下
vector<string> articles={"a","an","the"}
使用拷贝初始化时只能提供一个初始值;提供一个类内初始值,只能只用拷贝初始化或者花括号形式初始化;如果提供的时初始值元素列表,只能用花括号,不能用括号。
创建指定数量的元素
vector<int> ivec(10,-1);//创建10个每个都被初始化为-1
vector<string> svec(10,"hi");//创建10每个都被初始化为hi
注意,可以只定义初始化个数,初始化的值可以默认,int为0,string为空对象。记住,
vector<int>(10);//括号内为元素个数,该例为10个默认初始化元素
vector<int>{10};//花括号为初始化的值,该例含义为一个对象初始值为10
类型为string时要特殊考虑。
- vector的相关操作
v.empty() | 如果v不含有任何元素,返回真;否则返回假 |
v.size() | 返回v中元素的个数 |
v.push_back(t) | 向v的尾端添加一个值为t的元素 |
v[n] | 返回v中第n个位置上元素的引用 |
v1=v2 | 用v2中元素的拷贝替换v1中的元素 |
v1={a,b,c,……} | 用列表中元素的拷贝值替换v1中的元素 |
v1==v2 | v1和v2相等,当且仅当他们的元素数量相同且对应位置的元素值都相同 |
v1!=v2 | 不等时返回真 |
<,<=,>,>= | 按字典序比较 |
vector对向的下标运算可以用于访问已经存在的元素,而不能用于添加元素。
- 解引用成员访问可以使用->来简化,例如
(*it ).men()与it->men相同。
- 不能使用范围for向vector中添加元素;任何一个可能改变vector对象容量的操作都会是该vector对象的迭代器失效。即凡是使用了迭代器的循环体都不要向迭代器所属的容器添加元素。
==============================================================================
以下为数组相关:
- 不允许一个数组直接赋给另外一个数组。字符串数组声明时需要考虑隐含的空白符作为结尾。
- 复杂数组声明
int *ptrs[10]; //ptrs是数组,含有10个整形指针的数组
itn &refs[10]=/*?*/; //错误,不存在引用的数组
int (*Parray)[10]=&arr; //Parray是指针,指向一个含有10个整数的数组
int (&arrRef)[10]=arr; //arrRef是一个引用,引用一个含有10个整数的数组
int *(&arry)[10]=ptrs; //arry是数组的引用,该数组有10个指针
//判断数组声明的含义,从内向外,从右向左。
- 定义在函数体外的int数组初始化为0;函数体内定义int数组初始化随机数。
- 允许使用数组来初始化vector对象。要实现这一目的,只需指明要拷贝区域的首元素地址和尾后地址即可。
int arr={0,1,2,3,4,5,6};
vector<int> vec(begin(arr),end(arr));
注意end(arr)指向arr最后一个元素的后一个位置,即可以写成
vector<int> vec(arr,arr+7)
- string.h的常用函数
strlen(p) | 返回p的长度 |
strcmp(p1,p2) | 比较p1和p2的相等性,p1==p2返回0;p1>p2返回正数;p1<p3返回负数 |
strcat(p1,p2) | 把p2附加到p1后,返回p1 |
strcpy(p1,p2) | 将p2拷贝给p1,返回p1 |
传入此类函数的指针必须指向以空字符作为结束的数组。
char ca[ ]={‘c’,‘+’,‘+’};//没有以空字符做结尾
cout<<strlen(ca)<<endl;//严重错误,ca没有空字符结尾。
- 字符串的比较结果:string对象的比较的是字典序,存在大小关系;字符串数组比较的是两个无关的地址,如果想要比较两个数组字符串,需要strcmp函数。
- string中还有一个返回字符串数组的函数,便于处理string与字符数组的运算
string s(“hello world”);
const char *str=s.c_str();//c_str()返回一个字符串数组。
- 数组与指针容易引起访问非法位置,尽量使用vector和迭代器还有string对象。
严格来说,c++没有多维数组,只有数组的数组。
使用范围for处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。