C++ Vector解析

在写程序的时候看见别人用了vector,然而我还不太了解,那就学习记录一下。

什么是vector

菜鸟教程里的解释是这样:

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

vector的性质

  • 顺序存储
    容器内元素按顺序排列,类似数组,可通过位置访问对应元素。

  • 动态数组
    当元素插入或删除时能够自动改变容器大小。

vector实例

引入

1
2
# include<vector>
using std::vector;

在容器最后增加/删除元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> obj;
int temp = 0;
for(int i=0; i<5; ++i)
{
cin >> temp;
obj.push_back(temp);
cout << obj[i] << ",";
}
cout << endl;
obj.pop_back();
obj.pop_back();
for(int i=0; i<obj.size(); ++i)
{
cout << obj[i] << ",";
}

测试与返回结果如下所示:

1
2
3
1 2 3 4 5
1,2,3,4,5,
1,2,3,

清除容器内所有元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int> obj;
int temp = 0;
for (int i = 0; i < 5; ++i)
{
cin >> temp;
obj.push_back(temp);
cout << obj[i] << ",";
}
cout << endl;
obj.clear();
for (int i = 0; i < obj.size(); ++i)
{
cout << obj[i] << ",";
}

测试与返回结果如下所示:

1
2
1 2 3 4 5
1,2,3,4,5,

容器元素排序

我们需要用到头文件algorithm中的sort方法,所以首先引入头文件:

1
2
#include<algorithm>
using std::sort;

引入后,我们使用以下代码测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vector<int> obj;
int temp = 0;
for (int i = 0; i < 5; ++i)
{
cin >> temp;
obj.push_back(temp);
cout << obj[i] << ",";
}
cout << endl;
sort(obj.begin(), obj.end());
for (int i = 0; i < obj.size(); ++i)
{
cout << obj[i] << ",";
}
cout << endl;
reverse(obj.begin(), obj.end());
for (int i = 0; i < obj.size(); ++i)
{
cout << obj[i] << ",";
}

代码测试与返回结果如下所示:

1
2
3
4
1 8 6 9 4
1,8,6,9,4,
1,4,6,8,9,
9,8,6,4,1,

这里,我们用到了begin和end函数,当容器中有元素时,begin操作指向第一个元素,end操作则指向容器末端元素的“下一个”,即指向了一个不存在的元素,我们在迭代器一节中将会进一步看到这两个函数的使用。

若需要从大到小排序,我们只需要添加sort函数的参数并重写规则即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int> obj;
int temp = 0;
for (int i = 0; i < 5; ++i)
{
cin >> temp;
obj.push_back(temp);
cout << obj[i] << ",";
}
cout << endl;
sort(obj.begin(), obj.end(), compare);
for (int i = 0; i < obj.size(); ++i)
{
cout << obj[i] << ",";
}

compare函数内容如下:

1
2
3
4
bool compare(int a, int b)
{
return a > b; //降序排列
}

代码测试与返回结果如下所示:

1
2
3
1 9 8 5 6
1,9,8,5,6,
9,8,6,5,1,

除此以外,我们还需要迭代器辅助实现一些功能。

迭代器

迭代器定义

以下这段定义引自维基百科:

迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的介面,设计人员无需关心容器物件的内存分配的实现细节。

简单来说,迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。
那么我们需要用迭代器干什么呢? 很简单,遍历。

vector引用iterator实例

遍历

迭代器可通过自增操作来访问迭代器所指向的元素,可以类比一下C语言中的指针。

1
2
3
4
5
6
7
8
9
10
11
12
vector<int>::iterator it;
vector<int> obj;
int temp = 0;
for (int i = 0; i < 5; ++i)
{
cin >> temp;
obj.push_back(temp);
}
for (it = obj.begin(); it != obj.end(); it++)
{
cout << *it << ", ";
}

测试与返回结果如下所示:

1
2
1 2 3 4 5
1, 2, 3, 4, 5,

查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int>::iterator it; //定义迭代器
vector<int> obj;
int temp = 0;
for (int i = 0; i < 5; ++i)
{
cin >> temp;
obj.push_back(temp);
cout << obj[i] << ",";
}
cout << endl;
it = find(obj.begin(), obj.end(), 3); //查找目标为数字3
if (it == obj.end())
cout << "NO" << endl;
if (it != obj.end())
cout << "YES" << endl;

测试与返回结果如下所示:

1
2
3
1 2 3 4 5
1,2,3,4,5,
YES

参考文献

一杯咖啡