vector
#include
using std::vector;
初始化;
常用的操作:
v.empty();
v.size(); 返回的也是配套的size_type类型。
v.push_back(t);在尾端添加一个值为t的元素。注意的是,不能用下标运算添加元素。如果在循环体里有添加vector元素的语句,则不能使用范围for语句。
v[ n];下标运算符。
v1=v2;赋值操作,数组却不能赋值给另外一个数组。
一系列比较运算,注意的是,只用当元素的值可以比较时,vector对象才能被比较。
迭代器
迭代器其实用来代替指针对容器的数据进行操作的一种产物,它避免了对指针的误用带来的错误。它定义在各种容器类里。
比如说
vector
auto it =vec.begin();迭代器,指向vector的第一个元素;
迭代器的类型:
iterator和const_iterator。一个能读写指向的内容,一个只能读。
获取迭代器的方法
auto a=vec.begin(); 获取一个指向容器首的一个迭代器
auto b=vec.end();获取一个指向容器尾的下一个位置的迭代器。
迭代器的运算符
*it
it->mem;
++it;
--it;
==
!=
和指针一样,迭代器可以进行一系列的算数运算;迭代器相减的距离的类型为 difference_type,是带符号类型;
注意的一点:改变vector对象容量的操作,都会使该vector对象的迭代器失效。
数组
基本都是之前学的知识;
要注意的是理解复杂数组的声明
int(*p) [10 ]= &a;//p 是一个指向一个int[10]的指针
int (&p) [10]= b;// p 引用一个int [10];
数组的长度类型为size_t,定义在cstddef头文件中,是个无符号类型。
数组名在很多地方,在编译器看来是一个指针。这里要注意auto和decltype的区别。数组名在auto看来是个指针,但decltype看来却不是。
为了方便的使用数组,c++11定义了标准库函书begin和end;和容器中的两个同名函数功能类似。
#include
int a[ ]={1,2,3};
auto b=std::begin(a);b是指向a[0] 的指针
auto c=std::end(a);c是指向数组尾的下一个位置的指针
使用数组初始化vector对象。但尽量避免使用数组和指针。
使用范围for语句处理多维数组。
for(const auto &row : ia)
for(auto col ; row)
cout<
这里要注意的是auto。因为用了auto,所以最外层要把row申明为引用。不然row在auto看来就是指针,就出错了。