首页 > 技术文章 > STL之vector动态数组(详解)

zhengyongle506 2019-03-12 21:23 原文

vector收录在STL里,是一种特殊的数据结构。它的中文名字叫做“动态数组”或者“不定长数组”,有时也被翻译成“容器”。
基本操作:
  1、构造一个vector:vector<T> vec。其中T是我们数组要储存的数据类型,可以是int、float、double等。初始的时候vec是空的 。
  2、通过push_back()方法在数组最后面插入一个新的元素。
  3、通过size()方法获取vector的长度,通过[]操作直接访问 vector中的元素,和数组是一样的。
  4、修改vector中某个元素的话,只需要用=给它赋值来修改vector中某个元素。
  5、调用clear()方法就可清空vector。

例子如下:

 1 #include<vector>//不要忘记打头文件 
 2 using namespace std;
 3 //定义方法: 
 4     vector<int> myvec;// 一开始先定义一个整型的空的vector动态数组
 5     //也可以先赋给它初始值: 
 6     vector<int> m(a,b); //在m里装a个b
 7     vector<int> n(a);//在n里装a个0,通常可以省略"(a)"
 8     //也可以这么玩:
 9     vector<int> a(myvec);//定义一个和myvec一模一样的动态数组
10     vector <int> b(a.begin()+l,a.end()-r);//继承a动态数组下标[l,a.end()-r)的值,注意,下标从0开始
11 int main(){
12
13 //使用方法:
14     
15     myvec.front();//返回myvec数组的第一个元素的值,即0 
16     myvec.back();// 返回myvec数组的最后一个元素的值,即2 
17     myvec.begin();//返回myvec数组的第一个数的下标,即0
18     myvec.end();//返回myvec数组的最后一个数的下标,即2 
19     myvec.empty();//判断myvec数组是否为空,是空则返回1(true),非空(有元素)则返回0(false)
20     myvec.swap(m);//m是另一个动态数组,这里是将myvec和m的元素互换,可以直接写swap(myvec,m) 
21     myvec[1]=3;//变成0,3,2(落谷网校讲义上的可能是作者手误吧,竟然打成了0,3,3 ,其实模拟一下就很容易得到正确答案) 
22     myvec[2]=1;//变成0,3,1
23 //vector的插入:
24     myvec.push_back(0);//在myvec数组的尾部插入数,现在vector动态数组里的元素有:0
25     myvec.push_back(1);//现在vector动态数组里的元素有:0 ,1
26     myvec.push_back(2);//现在vector动态数组里的元素有:0 ,1,2
27     myvec.insert(myvec.begin()+k,a);//在下标k的前面插入数a,k之后的数依次后退一位
28     myvec.insert(myvec.begin()+k,p,a);//在下标k前面插入p个a,k之后的数依次后退一位
29 //输出方法: 
30     for(int i=0; i<vec.size(); ++i) //从头依次输出vector中的元素
31     {
32         printf("%d\n",vec[i]);
33     }
34     //如果需要遍历元素,还可以使用迭代器。(反正我是不会,大神可以继续)
35     for(vector<int>::iterator it=myvec.begin(); it!=myvec.end(); it++) {
36         printf("%d\n",*it);
37     }
38 //vector的删除
39     myvec.pop_back()//删除最后一个元素
40     myvec.erase(myvec.begin()+k);//删除下标为k的数,返回下一个位置的下标
41     myvec.erase(myvec.begin()+l,myvec.end()-r);//删除下标[l,myvec.end()-r)的元素
42     myvec.clear();//清空vector动态数组 
43 //打代码时千万不要忘记它是从vec[0]开始的 ! 
44 //除myvec[i]外,其余都是vector的自带函数,因此必须添上括号!
45 } 

有关vector的内存机制和性能分析可以参考这个网址:https://blog.csdn.net/mfcing/article/details/8746256

不要尝试自己测试,除非你对自己的电脑有很大的信心,反正我用学校机房电脑测试了一下直接蓝屏了…… 

推荐阅读