标准库 vector 类型

标准库 vector 类型

vector 不是一种数据类型,而是一个类模板,可以用来定义多种数据类型。比如 vector 或者 vector,这都属于数据类型。vector 中,动态增长更加有效。

如何初始化一个 vector

1
2
3
4
5
6
7
8
9
vector<T> v1; //默认构造函数,v1为空
vector<T> v2(v1); //v2是v1的一个副本
vector<T> v3(n, i); //v3包含了n个值为i的元素
vector<T> v4(n); //v4含有初始化的元素的n个副本

//C++11新标准
vector<string> art = {"a", "b", "c"};
//or
vector<string> art{"a", "b", "c"};//这种初始化方式不能用小括号。

如果 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
2
3
4
for(vector<string>::iterator it = text.begin(); it != text.end(); ++it)
{
std::cout << *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::const_iterator 类型,如

1
auto it3 = vec.cbegin(); //此时it3就是vector<int>::const_iterator