(C/C++学习笔记)2.C++中vector的使用

说明:vector是C++中一个非常方便的容器类,它用于存放类型相同的元素,利用成员函数及相关函数可以方便的对元素进行增加或删除,排序或逆序等等,下面将对这些功能一一叙述。

一.vector的第一种用法

1.包含的头文件:#include<vector>

2.格式:vector<Type> vi;

创建一个元素类型为Type的vector对象,Type可以是int,double,string,甚至还可以是结构体类型,

3.vi.pushback(Type a);

在容器的尾部插入一个元素,需要注意的是,插入元素的类型应该与创建 对象时的类型一致。

4.通过下标法像数组一样来访问元素,cout<<vi[i];表示打印vi的第i+1元素到显示屏上,同数组一样,下标访问是从0开始的,这也是此处为什么是第i+1个元素的原因。

5.利用迭代器来访问元素,首先得创建一个迭代器格式如下:

vector <Type>::iterator it;

然后访问方式如下: 

  1 for(it = vi.begin();it != vi.end();it++)
  2    cout<<*it<<"";
  3 //vi.begin()表示从vi的第一个元素开始,vi.end()表示vi的最后一个元素


6.vi.insert(vi.begin()+count,'a');

在第count个元素后插入‘a’这个元素,(注意插入元素类型也应该与创建是的元素类型一致)

7.vi.erase(vi.begin()+3,vi.begin()+6);

删除区间第[3+1,6]个元素,若第二个参数不写,如:vi.erase(vi.begin()+3),则表示删除第(3+1)个元素。

8.以下为两个对容器元素进行翻转和排序的函数,使用时需包含的头文件:#include<algorithm>

(笔者所用的编译环境为QtCreator5.5,在使用时,试了一下,没包含也没报错)

a.reverse(vi.begin(),vi.end());

将容器中的所有元素进行翻转,即从尾排到头。

b.sort(vi.begin(),vi.end(),Comp);

按照Comp函数所自定义的排序方式对容器类的元素进行排序,假如定义的Comp函数如下:    

  1 bool Comp(const int &a,const int&b)      //自定义元素排列顺序
  2 {
  3     return a>b;
  4 }

则sort函数将按照定义的比较函数进行排序,此处为降序排列,即从大到小。值得注意的是,sort函数的第三个参数是可有可无的,当不写时,默认按照升序即从小到大排列,并且当第三个参数存在时,其格式只能为函数名,不能加函数括号,否则会报错。

9.vi.clear();

清空元素。

下面将用一段代码综述以上所讲,仔细看完这段代码,一切将会豁然开朗:

示例1:

  1 #include<iostream>
  2 #include<vector>
  3 #include<algorithm>
  4 using namespace std;
  5 
  6 bool Comp(const int &a,const int&b)      //自定义元素排列顺序
  7 {
  8     return a>b;
  9 }
 10 
 11 int main()
 12 {
 13     vector<int> vi;
 14     //创建vector对象
 15 
 16     cout<<"sizeof(vi) = "<<sizeof(vi)<<endl;
 17     //模板类对象vi的大小永远是12(本机)
 18 
 19     cout<<endl<<"+++++++++++++++++++++++++++++++++++++"<<endl;
 20     //分隔符,为了更好地看结果
 21 
 22     for(int i = 0;i<10;i++)
 23         vi.push_back(i);
 24     //在容器尾部插入数字
 25 
 26     for(int i = 0;i<10;i++)
 27         cout<<vi[i]<<"";
 28     //使用下标访问元素,下标是从0开始的
 29 
 30     cout<<endl<<"++++++++++++++++++++++++++++++++++++++"<<endl;
 31     //同上
 32 
 33     vector<int>::iterator  it;
 34     //创建一个迭代器用来访问容器vi
 35 
 36     for(it = vi.begin();it != vi.end();it++)
 37         cout<<*it<<"";
 38 
 39     cout<<endl<<"++++++++++++++++++++++++++++++++++++++"<<endl;
 40     //同上
 41 
 42     vi.insert(vi.begin()+3,'a');
 43     //在第(3+1)个元素前插入'a';
 44 
 45     for(it = vi.begin();it != vi.end();it++)
 46         cout<<*it<<"";
 47 
 48     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++"<<endl;
 49 
 50     vi.erase(vi.begin()+3);
 51     //删除第(3+1)个元素
 52 
 53     for(it = vi.begin();it != vi.end();it++)
 54         cout<<*it<<"";
 55     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
 56 
 57     vi.erase(vi.begin()+3,vi.begin()+6);
 58     //删除区间第[3+1,6]个元素
 59 
 60     for(it = vi.begin();it != vi.end();it++)
 61         cout<<*it<<"";
 62     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
 63 
 64     cout<<"vi.size() = "<<vi.size()<<"";
 65     //求向量的大小(包含的元素个数)
 66 
 67     cout<<"sizeof(vi) = "<<sizeof(vi)<<endl;
 68     //求类对象vi的大小
 69     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
 70 
 71     reverse(vi.begin(),vi.end());
 72     //将元素翻转
 73 
 74     for(it = vi.begin();it != vi.end();it++)
 75         cout<<*it<<"";
 76     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
 77 
 78     sort(vi.begin(),vi.end());
 79     //将元素排序,默认从小到大
 80 
 81     for(it = vi.begin();it != vi.end();it++)
 82         cout<<*it<<"";
 83     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
 84 
 85     sort(vi.begin(),vi.end(),Comp);
 86     //按自定义顺序进行排列元素
 87 
 88     for(it = vi.begin();it != vi.end();it++)
 89         cout<<*it<<"";
 90     cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
 91     return 0;
 92 }

程序运行结果:

二.vector的第二种用法(头文件同上)

1.格式:vector<int> vi(10);(相当于int vi[10];)

其实此种方式与上种在使用方式上几乎一样,唯一的差别在于这种方式在创建一个vector对 象时就已经确定了其大小,并且对于int,double以及指针等类型,默认初始化为0,当然也可以人 为初始化,如:vector<int> vi<10,1>;创建了一个vi对象,含有十个int类型的元素,并且每个元素都被初始化为1,需要注意的是,对于数组,可以这样来初始化:

int vi[3] = {1,2,3};

但对于vector对象,则不行。但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定用来初始化 vector 的数组的开始地址以及(结束地址+1)即可,例如:

示例2:    

  1 #include<iostream>
  2 #include<vector>
  3 using namespace std;
  4 
  5 int main()
  6 {
  7     int arr[5] = {0,1,2,3,4};
  8     vector<int> vi(arr+1,arr+4);
  9     //用数组的第2~4个元素初始化vi
 10 
 11     vector<int>::iterator  it;
 12     //使用迭代器访问元素
 13 
 14     for(it = vi.begin();it != vi.end();it++)
 15         cout<<*it<<"";
 16     return 0;
 17 }

程序运行结果:

2.vector对象可用另一个vector对象来初始化,

vector<int> vi(10,1);

vector<int> vj(vi);

3.需要注意的是,用这种方式在创建对象时虽然确定了其大小,但后续的插入,删除等操作会改变‘对象的大小,例如:

示例:

  1 #include<iostream>
  2 #include<vector>
  3 using namespace std;
  4 
  5 int main()
  6 {
  7     vector<int> vi(10,1);
  8     vector<int>::iterator  it;
  9     for(it = vi.begin();it != vi.end();it++)
 10         cout<<*it<<"";
 11     cout<<endl<<"vi.size = "<<vi.size()<<endl;
 12     //打印初始大小
 13 
 14     cout<<"+++++++++++++++++++++++++++++"<<endl;
 15     int i = 0;
 16     for(;i<5;i++)
 17         vi.push_back(i);
 18     for(it = vi.begin();it != vi.end();it++)
 19         cout<<*it<<"";
 20     cout<<endl<<"vi.size = "<<vi.size()<<endl;
 21     //打印插入5个元素后的大小
 22 
 23     cout<<"+++++++++++++++++++++++++++++"<<endl;
 24     vi.erase(vi.begin()+1);
 25     for(it = vi.begin();it != vi.end();it++)
 26         cout<<*it<<"";
 27     cout<<endl<<"vi.size = "<<vi.size()<<endl;
 28     //打印删除一个元素后的大小
 29 
 30     return 0;
 31 }

程序运行结果:

猜你喜欢

转载自www.cnblogs.com/tuihou/p/9691199.html