vector 称为容器模板类,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型,如vector<int> 和vector<string> 都是数据类型。vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
初始化:
-
int myarray[5] = {1,3,5,7,9};
- vector<int> ivec1(myarray , myarray+5);//数组元素值赋值给vector,深拷贝直接赋值
- vector<int> ivec2(ivec1);// ok: copy elements of ivec1 into ivec2 ,深拷贝
- vector<int> ivec3=ivec2;//ok,深拷贝
- vector<string> svec(ivec1);// error: svec holds strings, not ints
- vector<int> ivec4(10, -1); // 10 elements, each initialized to -1
- vector<string> svec(10, "hi!");// 10 strings, each initialized to "hi!"
注意:
①vector 中的对象是没有命名的,可以按 vector 中对象的位置来访问它们。使用下标索引[]访问,下标从0开始,且下标只能获取已存在的元素
②使用size_type 类型时,必须指出该类型是在哪里定义的。如vector<int>::size_type i
- for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
- ivec[ix] = 0;
③迭代器访问对象(推荐)
- vector<int>::iterator it;
- for(it=vec.begin();it!=vec.end();it++)
- cout<<*it<<endl;
1.常用函数列表
push_back()------新对象插入到末尾 insert()-------------插入一个元素或多个元素或一个内范围元素至矢量中的指定位置 pop_back()--------删除末尾元素 at()------------------返回对指定的索引对象的引用 front()---------------返回最前面一个数据的引用 back()---------------传回最后一个数据的引用,故赋值时也应该是同类型的引用类型,若为空返回值不确定。 begin()--------------Returns a random-access iterator to the first element in the vector. end()----------------Returns the past-the-end iterator. data()----------------Returns a pointer to the first element in the vector. assign()-------------清空vector并复制制定的元素到vector erase()--------------删除指定的元素或者制定区间段的元素 resize()--------------重定义size clear()---------------移除容器中所有数据 empty()--------------判断容器是否为空,为空则为真。
- vector<int> v1,v2;
- vector<int>::iterator c1_Iter;
- v1.push_back(10);
- v1.push_back(11);
- v1.push_back(12);v1.push_back(13);
- v1.push_back(14);
- v1.pop_back();
- int &a=v1.front();//引用
- int &b=v1.back( );//引用
- int &c= v1.at(0);//引用
- c1_Iter = c1.begin();//迭代器类型
- c1_Iter = c1.begin();//返回指向末尾元素的后一个的迭代器
- v2.assign(v1.begin(), v1.end());//v2=v1
- v2.assign({ 5, 6, 7 });//5,6,7依次push至末尾
- v2.assign(4,10);//v2=10 10 10 10
- v2.assign(v1.begin()+2, v1.begin()+4)//将v1索引2 3的元素赋给v2</span>
- v1.erase( v1.begin( ) );//删除索引0元素
- v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );//删除索引1 2 3的元素
- v1.resize( 2,40 );
- cout << "The size of v1 is " << v1.size( ) << endl;//输出6
- cout << "The value of the last object is " << v1.back( ) << endl;//输出40
- v1.resize( 10);
- cout << "The size of v1 is now " << v1.size( ) << endl;//输出10
- cout << "The value of the last object is now " << v1.back( ) << endl;//输出0
- v1.insert( v1.begin( ) + 1, 88);//原索引1之前插入88
- v1.insert( v1.begin( ) + 2, 4, 50 );//原索引2之前插入4个50
- v1.insert( v1.begin( )+1, v1.begin( )+2, v1.begin( )+4 );//将原索引2,3的元素复制插入原索引1之前
- vector < vector <int> > vv1;// initialize a vector of vectors by moving v1
- vv1.insert( vv1.begin(), move( v1 ) );
- if (vv1.size( ) != 0 && vv1[0].size( ) != 0 )
- {
- vector <int>::iterator Iter;
- cout << "vv1[0] =";
- for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
- cout << " " << *Iter;
- cout << endl;
- }
- v1.clear( );//清空vector
2.vector之结构体
vector元素类型还可以是结构体,使用时注意结构体要定义为全局。
- #include"stdafx.h"
- #include<vector>
- #include<iostream>
- using namespace std;
- typedef struct rect
- {
- int id;
- int length;
- int width;
- }Rect;
- int main()
- {
- vector<Rect> vec;
- Rect rect={1,2,3};
- vec.push_back(rect);
- vector<Rect>::iterator it=vec.begin();
- cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
- return 0;
- }
3.vector之string
vector<string>类型的快速初始化和输出
- #include"stdafx.h"
- #include<iostream>
- #include<vector>
- #include"string"
- using namespace std;
- int main()
- {
- string str[]={"hello", "world", "CHB"," "};
- vector<string> strArray1(10,"hello");
- vector<string> strArray(str,str+sizeof(str)/sizeof(str[0]));
- for(vector<string>::iterator iter=strArray.begin();iter!=strArray.end();++iter)
- cout<<*iter<<endl;//换行符也被读入
- for(vector<string>::size_type i=0;i<strArray1.size();i++)
- cout<<strArray1[i]<<endl;;
- return 0;
- }
4.作为参数或者返回类型
作为参数或者返回类型时。尊崇一般策略。比如,对于main()中的vector,子函数应该使用引用才能改变其值。例如任意数转换为2进制。如下:
#include"iostream" #include"vector" using namespace std; void Convert(vector<int> &ans,int number,int n) { if(!number)return; else {ans.push_back(number%n); Convert(ans,number/n,n);} } void main() { int number=121; vector<int> ans; Convert(ans,number,2); if(!ans.empty()) for(int it=ans.size()-1;it>=0;it--) cout<<ans[it]; cout<<endl; }
5.Vector 变量之间的赋值
直接使用赋值符号“=”赋值,构造函数()赋值,或者数组赋值。均为深拷贝,即改变源vector元素的值不会对目标vector造成影响。如下所示;
void main() { int myarray[5] = {1,3,5,7,9}; vector<int> v1(myarray , myarray+5);//深拷贝,指向地址不同 vector<int> v2 = v1,v3(v1);//深拷贝,指向地址不同 myarray[0]=10; cout<<v1[0]<<" "; v1[2]=11; cout<<v2[2]<<" "; cout<<v3[2]<<" "<<endl; string s[3]={"we","love","china"}; vector<string> s1(s,s+3);//深拷贝,指向地址不同 vector<string> s2=s1,s3(s1);//深拷贝,指向地址不同 s[0]="everyone"; cout<<s1[0]<<endl; s1[2]="Hubei"; cout<<s2[2]<<endl; cout<<s3[2]<<endl; }输出为:
6.结合Pair类型的使用
Pair类型概述
pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:
pair<int, string> a;
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。直接对其初始化 pair<string, string> a("James", "Joy");
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
typedef pair<string, string> mypair; mypair pro("May", "Lily"); mypair joye("James", "Joyce");
对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员。
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);
简单的代码如下:#include "iostream" #include"algorithm" #include"vector" #include"string" using namespace std; bool strict_weak_ordering(const pair<int,std::string> a, const pair<int, std::string>b) { return a.first < b.first;} int main() { using namespace std; vector<pair<int, string> > vec; vec.push_back(make_pair<int, string>(6, "ABC")); vec.push_back(make_pair<int, string>(4, "BCD")); vec.push_back(make_pair<int, string>(7, "EFG")); sort(vec.begin(), vec.end(), strict_weak_ordering); for( vector<pair<int, string>>::iterator it =vec.begin(); it !=vec.end(); ++it) cout<<it->second<<endl; return 0; }
7.附加
#include<algorithm>中的泛函算法
搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if()
分类排序:sort()、merge()
删除算法:unique() 、remove()
生成和变异:generate() 、fill() 、transformation() 、copy()
关系算法:equal() 、min() 、max()
部分参考自 C++ vector类型要点总结