Vector1

vector类是随标准 C++引入的标准库STL的一个类,它为C++内置数组提供了一种替代方式,为了使用vector 我们必须包含相关的头文件 :

1
#include <vector>

使用vector有两种不同的形式,即所谓的数组习惯和STL习惯。

一、数组习惯用法


1. 定义一个已知长度的 vector :

1
vector<int> v(10);  //类似数组定义int a[10];


访问时,直接使用[]索引号或者iterator来访问; 使用 if(v.empty()) 判断是否是空; v.size()判断元素个数。

vector的元素被初始化为与其类型相关的缺省值:算术和指针类型的缺省值是 0,对于class 类型,缺省值可通过调用这类的缺省构造函数获得,我们还可以为每个元素提供一个显式的初始值来完成初始化,例如

1
2
3
4
5
6
7
8
9
10
11
12
vector<int> v(10, 1); 
//定义了向量v,它包含十个int型的元素 每个元素都被初始化为1
```
对于内置数组,我们可以直接使用常量来初始化,比如:

int ia[ 6 ] = { 0, -1, 0, 1, 2, 1024 };

但是vector中不允许这么做,但是可以将vector初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现,例如:

```
// 把 b 的前6个元素拷贝到v中
vector<int> v(b, b+6);


或者,vector可以被另一个vector初始化,或被赋给另一个vector。例如

1
2
3
4
5
6
7
8
9
vector<string> v; 
void init_and_assign() {
// 用另一个 vector 初始化一个 vector,x is another vector
vector<string> v(x);
// ...

// 把一个 vector 拷贝给另一个 vector
v = x;
}


二、STL习惯用法

在STL9中对vector的习惯用法完全不同。我们不是定义一个已知大小的vector,因为vector的优势之一就是大小可以变化,所以没有必要一来就将其Size定死。比如定义一个空vector:

1
vector< string > sheet;

然后,我们需要做的不是赋值,而是插入元素。例如push_back()操作,就是在vector的后面插入一个元素. 下面的while循环从标准输入std::cin读入一个字符串序列,并每次将一个字符串插入到 vector 中

1
2
3
4
5
string word; 
while ( cin >> word ) {
text.push_back( word );
// ...

}

虽然我们仍可以用下标操作符来迭代访问元素, 但是更典型的做法是使用vector操作集中的begin()和 end()所返回的迭代器iterator,在之前访问那一小句话中提到过,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
cout << "words read are: \n"; 
for(vector<string>::iterator it = text.begin(); it != text.end(); ++it ){
cout << *it << ' ';
}
cout << endl;
```

iterator 是标准库中的类,它具有指针的功能.

注意, 不要混用这两种习惯用法. 一个反例如下, 先定义了一个空Vector,再赋值:

{% codeblock lang:C++ %}
vector<int> v;
v[0] = 6666;
{% endcodeblock %}

这就是错误的, 因为v还没有第一个元素,我们只能索引vector中已经存在的元素size()操作返回 vector包含的元素的个数。

<h2>三、 其他常用方法:</h2>

```
vector::size
vector::clear
vector::push_back
vector::pop_back
vector::swap
vector::erase
vector::insert
vector::swap


/*Exchanges the content of the container by the content of x,
which is another vector object of the same type. Sizes may differ.*/
vector::shrink_to_fit (C++11)

For more method, please visit:
http://www.cplusplus.com/reference/vector/vector/