C++中的vector 用法解析
一、概述
vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种 数据结构和算法 的模板类和函数库。
vector 是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。
1 //C语言风格
2 int myhouse[100];
3 //采用vector
4 vector<int> vecmyhouse(100);
当如上定义后,vecmyhouse就可以存放100个int 型的数据了。
1 它可以像普通数组一样访问
1 vecmyhouse[50] = 1024;
2 你可以顺序的向容器中填充数据
1 int i=0;
2 for(;i<25;i++)
3 {
4 vecmyhouse.push_back(1);
5 }
3 可以动态的改变它的大小,通过下面这条语句实现
将容器的大小改为400,这样容器中就可容纳400个int 型数据了
1 vecmyhouse.resize(400);
4 可以在容器中装入自定义的数据类型
1 //自定义一个class
2 class cmyclass
3 {
4 。。。。。
5 };
6 //定义一个存放class的容器
7 vector<cmyclass> vedmyhouse;
5 可以在定义容器时为他赋初值
1 //定义一个容纳100个int型数据的容器,初值赋为0
2 vector<int> vecmyhouse(100,0);
6 可以把一个容器的对象赋值给另外一个容器
1 //定义一个容纳100个int型数据的容器,初值赋为0
2 vector<int> vecmyhouse(100,0);
3 //定义一个新的容器,内容与上述容器一样
4 vector<int> myvec;
5 myvec = vecmyhouse;
二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:
1 为了使用vector ,必须在你的头文件中包含下面的代码:
1 #include <vector>
2 vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上
1 using std::vector;
or
using namespace std;
or
std::vector<int> myhouse; //直接加上前缀
3 vector的声明
vector<ElemType> c; 创建一个空的vector
vector<ElemType> c1(c2); 创建一个vector c1,并用c2去初始化c1
vector<ElemType> c(n) ; 创建一个含有n个ElemType类型数据的vector;
vector<ElemType> c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;
c.~vector<ElemType>(); 销毁所有数据,释放资源;
4 vector 容器中常用的函数(c为一个容器对象)
c.push_back(elem); 在容器的最后位置添加一个元素elem
c.pop_back(); 删除容器最后位置处的元素
c.at(index); 返回指定index位置处的元素
c.begin(); 返回指向容器最开始位置数据的指针
c.end(); 返回指向容器最后第一个数据单元的指针+1
c.front(); 返回容器最开始单元数据的引用
c.back(); 返回容器最后一个数据的引用
c.max_size(); 返回容器的最大容量
c.size(); 返回当前容器中实际存放元素的个数
c.capacity(); 同c.size()
c.resize(); 重新设置vector的容量
c.reserve(); 同c.resize();
c.erase(p); 删除指针p指向位置的数据,返回指向下一个数据位置的指针(迭代器)
c.erase(begin,end); 删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)
c.clear(); 清除所有数据
c.rbegin(); 将vector反转后的开始指针返回(其实就是原来end-1)
c.rend(); 将vector反转后的结束指针返回(其实就是原来的begin-1)
c.empty(); 判断容器是否为空,若为空返回true,否则返回false
c1.swap(c2); 交换俩个容器中的数据
c.insert(p,elem); 在指针p指向的位置插入数据elem,返回指向elem位置的指针
c.insert(p,n,elem); 在位置p插入n个elem数据,无返回值
c.insert(p,begin,end) 在位置p插入在区间[begin,end)的数据,无返回值
三、下面描述一下什么是迭代器
迭代器相当于指针
1 //对于变量而言,使用指针指向对应的变量
2 //以后就可以使用 * 加指针来操作变量了
3 int a = 10;
4 int *p;
5 p = &a;
使用指针操作该变量,例如:*p = 11; // 操作后a变为 11
对于容器,使用迭代器操作容器中对应位置的值
当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了
1 //定义一个vector
2 std::vector<int> myvec;
3 //添加10个元素
4 for(int j=0; j<10; j++)
5 {
6 myvec.push_back(j);
7 }
1 // 定义一个迭代器
2 std::vector<int>::iterator p;
3 // 指向容器的首个元素
4 p = myVec.begin();
5 // 移动到下一个元素
6 p ++;
7 // 修改该元素赋值
8 *p = 20 ; //< 则myVec容器中的第二个值被修改为了20
9 // 循环扫描迭代器,改变所有的值
10 p = myVec.begin();
11 for( ; p!= myVec.end(); p++ )
12 {
13 *p = 50;
14 }
四 实例
1 /*---------------------------------------------
2 http://www.cnblogs.com/ziyi--caolu/archive/2013/07/04/3170928.html
3 http://blog.****.net/twphoenix/article/details/50628468#
4 ----------------------------------------------*/
5
6 #include <iostream>
7 #include <vector>
8 #include <stdlib.h>
9 #include <algorithm>
10
11
12 using namespace std;
13
14 /*-----------------------------------------
15 【1】 数据的输入和删除。push_back 和pop_back
16 依次在末尾加入输入的数字,然后将最后一个元素删除(success)
17 -----------------------------------------*/
18 /*
19 void main()
20 {
21 int i=0;
22 vector<int> v;
23 for (i = 0; i < 10; i++)
24 {
25 cin >> i;
26 v.push_back(i); //将元素添加到数组最后
27 }
28 for (i = 0; i < v.size(); i++) //v.size() 表示vector存入元素的个数
29 {
30 cout << "结果
"<<v[i] << endl;
31 //system("pause");
32
33 }
34 printf("
");
35 v.pop_back(); //将数组最后一个元素删除
36
37 for (i = 0; i < v.size(); i++)
38 {
39 cout << v[i] << endl;
40 }
41
42 printf("
");
43
44 system("pause"); //madan,千万不要写成puse
45
46 }
47 */
48
49
50 /*---------------------------------------------------
51 【2】元素的访问(调试不成功)
52 -----------------------------------------------------*/
53 /*
54 void main()
55 {
56 int i, n;
57 vector<int> v;
58 vector<int>::iterator it; //声明一个vector的迭代器
59
60 for (i = 0; i < 10; i++)
61 {
62 cin >> n;
63 v.push_back(n);
64 }
65
66 //(1) 通过操作[]访问
67 for (i = 0; i < v.size(); i++)
68 {
69 cout << v[i] << endl;
70 }
71 cout<<"
";
72
73 //(2)通过 at(index) 访问
74 for (i = 0; i < v.size(); i++)
75 {
76 cout << v.at(i);
77 }
78 printf("
");
79
80 //(3)通过迭代器iterator访问
81 for (it = v.begin(); it != v.end(); it++)
82 {
83 cout<< *it<<endl;
84 }
85 printf("
");
86
87 system("pause");
88
89 }
90 */
91
92 /*----------------------------------------------
93 【3】排序和查询 (升序和降序那里有点问题)
94 ------------------------------------------------*/
95 /*
96 void main()
97 {
98 int i, n;
99 vector<int> v;
100 vector<int>::iterator it; //声明一个vector的迭代器
101
102 for (i = 0; i < 10; i++)
103 {
104 cin >> n;
105 v.push_back(n);
106 }
107 it = find(v.begin(),v.end(),3); //进行查找元素3
108 if (it == v.end()) //如果没有该元素,则返回指向容器最后一个单元+1的指针
109 {
110 printf("该元素不存在与容器中
");
111 }
112 else
113 {
114 printf("%d
",it - v.begin());
115 }
116
117 sort(v.begin(),v.end()); //升序进行排序
118 for (i = 0; i <10; i++)
119 {
120 cout << v[i]<<" ";
121 }
122
123 reverse(v.begin(),v.end()); //降序进行排序
124 for (i = 0; i <10; i++)
125 {
126 cout << v[i] << " ";
127 }
128
129 system("pause");
130
131 }
132 */
133
134 /*---------------------------------------------------
135 【4】 二维容器(没太明白)
136 -----------------------------------------------------*/
137 void main()
138 {
139 int i, j;
140 int m;
141 vector< vector<int> > v; //定义二维容器的时候,最外面俩个<> 处一定要有空格,否则会报错
142 vector<int> v1;
143 for (i = 0; i < 4; i++) //使用二维容器之前对其进行初始化,否则会报错
144 {
145 v.push_back(v1);
146 }
147 for (i = 0; i < 4; i++)
148 {
149 for (j = 0; j < 4; j++)
150 {
151 cin >> m;
152 v[i].push_back(m);
153 }
154 }
155 printf("%d
",v.size()); //返回当前容器中的元素个数(不应该是16或更多么??????但实际是 4???)
156
157 for (i = 0; i < v.size(); i++)
158 {
159 for (j = 0; j < v[i].size(); j++)
160 {
161 printf("%d ",v[i][j]);
162 }
163 printf("
");
164 }
165 system("pause");
166
167 }
...................未完待续