「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
1、容器vector
C++既有类模板,也有函数模板,其中vector是一个类模板
vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,示例:vector<int>
- vector具体用法可以参考C++_STL——deque and vector)
2、迭代器
迭代类似于指针,可以理解为泛型指针,可以利用*解引用,迭代器提供了对对象的间接访问,标准库STL的内存分配一般用的是分配器,迭代器也有有效和无效之分,类似与指针;
使用迭代器
迭代器运算符
设迭代器为iterator iter
- ++iter 重载++运算符,令iter向容器中的下一个元素
- --iter 重载--运算符,令iter向容器中的上一个元素,forward_list、map,unordered_map等就不支持。
- *iter 重载*运算符返回迭代器iter所指向的引用
- iter->mem 解引用iter并获取名为mem的成员
- ==,!= 判断两个迭代器是否相等
注意:end()返回的是一个超尾迭代器,并不实际指示某个元素,所以不能对其进行递增或解引用,今天leetcode在用二分查找库时们判断返回是否是超尾迭代器,间接导致解引用,使堆内存溢出
注意:iterator与const_iterator,iterator可以对元素读写,const_iterator只能读,不能写,const_iterator包含如下
vetcor<int> v;
const vector<int> cv;
auto it1=v.begin();//iterator类型
auto it2=cv.begin();//const_iterator类型
auto it3=v.cbegin();//const_iterator类型
注意:不能向范围for循环对象添加元素
迭代器运算
设迭代器为iterator iter
- iter+n 紧部分迭代器支持,如vector,deque,string,加上n个位置
- iter-n 紧部分迭代器支持,如vector,deque,string,减去n个位置
- iter+=n 紧部分迭代器支持,如vector,deque,string,iter加上n个位置
- iter-=n 紧部分迭代器支持,如vector,deque,string,iter减去n个位置
- iter1-iter2 紧部分迭代器支持,如vector,deque,string,返回两个迭代器之间的距离
- >,>=,<,<= 紧部分迭代器支持,如vector,deque,string,判断哪个迭代器指向的元素更靠后
3、数组
C有的就不提了
-
不存在引用数组:int &x[10] 错误
-
int *p[5],p是含有五个指针的数组
-
int (*p)[5],p是指向含有5个整数数组的指针
-
int (&p)[5],p是指向含有5个整数数组的引用
注意cpp操作绑定方式从右向左,这样就很好理解,比如int *(arry)[10];
访问数组元素可以使用索引,或者范围for循环
指针和数组
注意:大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针,指针也是迭代器的一种,因为iterator_traits的存在
标准库函数begin(),end();示例:
int bbb[]={1,2,3};
int *start=begin(bbb);//start指向首元素
int *_end=end(bbb);//_end指向尾元素
指针运算
指针可以进行与迭代器一样的计算,与迭代器一样,指针的进行加减时一定要注意是否超出范围,否则会使整个程序崩掉
ptrdiff_t是一种标准库的两个指针相减类型,与size_t一样,为有符号型
下标和指针
数组与指针结合,可以下标为负值,示例
int b[]={1,2,3,4,5};
int *p=&b[2];
int p1=p[1]; //p1为4;
int p_1=p[-1];//p_1为2;
注意内置的下标运算符的索引值不是无符号类型,和一点与vector和string不一样