标准库 vector 类型
vector 不是一种数据类型,而是一个类模板,可以用来定义多种数据类型。比如 vector
如何初始化一个 vector
1 | vector<T> v1; //默认构造函数,v1为空 |
如果 T 为 int 类型,则标准库将用 0 来初始化,如果 T 为 string 类型,则标准库用空字符串来初始化。注意:不存在包含引用的 vector。
注意:vector 和 string 类似,其 元素个数 都要使用 size_type 来存储,有差异的是 vector 应使用 vector::size_type,而 string 则直接使用string::size_type。
注意:使用 vector 的下标法时,只能获取已经存在的元素,而不能添加元素。添加只能用 vector.push_back()。vector 下标的数据类型也是 vector::size_type
如何访问迭代器的值
可以通过 解引用(*) 的方式来获取,比如
1 | for(vector<string>::iterator it = text.begin(); it != text.end(); ++it) |
迭代器的 begin() 和 end() 操作
迭代器的 end() 操作返回的迭代器是指向了 vector 末端元素的下一个元素,即一个不存在的元素。他只是起一个哨兵的作用,表示我们已经处理完了这个 vector 中的所有元素。如果 vector 为空,则他的 begin() 和 end() 返回的迭代器是一样的。而且,使用 end() 操作返回的迭代器不支持解引用以及自增操作。
_const_iterator_ 和 const 迭代器 的区别
const_iterator 可以更改自己指向的对象,但是不能更改这个对象的值,而 const 迭代器 则是不能更改其指向的对象,但是可以更改指向的对象的值
迭代器的算术操作
1、迭代器在使用加号和减号之后会产生一个新的迭代器
1 | vector<int>::iterator it = iter + n; |
其中,加上或者减去的值的类型应该是vector的 size_type 类型或者是 difference_type 类型
注意:任何改变 vector 长度的操作都会使已存在的迭代器失效!
2、两个迭代器做减法计算的是两个迭代器对象的距离
1 | iter1 - iter2; |
该距离的返回值类型是一个 difference_type 的类型。这是一个 signed 类型的值,因为两个迭代器的距离有可能是负数。
这两个迭代器必须都指向同一个 vector 中的元素,或者指向 vector 末端之后的下一个元素(vector.end())
关于包含 vector 的 vector
C++11中允许
1 | vector<vector<int> > vec; |
和
1 | vector<vector<int>> vec; |
但是老的C++只允许第一种。
cbegin和cend
这两个类似于 begin 和 end,区别是无论 vector 是不是常量,它的返回值都是 vector
1 | auto it3 = vec.cbegin(); //此时it3就是vector<int>::const_iterator |