C++ 笔记——vector、迭代器、数组

1,096 阅读3分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

1、容器vector

C++既有类模板,也有函数模板,其中vector是一个类模板

vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,示例:vector<int>

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不一样