说明: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 }
程序运行结果: