C++:vector容器大全
1、vector数据存储结构:vector的扩充机制:按照当前容器的一倍扩充;vector分配一块连续的内存空间,每次扩充内存空间并不是在原有空间基础上进行叠加,而是重新申请一块更大的内存,并把现有容器中的元素逐个复制,然后销毁旧的内存。【注】:此时,指向旧内存空间的迭代器已经失效,当操作容器时要及时更新迭代器。vector数据结构,连续线性存储。采用3个迭代器_First、_Last、_End指向分配线性空间的不容范围。迭代器变量声明: template<class _Ty, class _A= allocator< _Ty>> class vector { ... protected: iterator _First, _Last, _End; };其中, _First:指向使用空间的头部, _Last:指向使用空间大小(size)的尾部 _End:指向使用空间容量(capacity)的尾部

3、vector构造函数原型: template<typename T> explicit ve艘早祓胂ctor();// 默认构造函数,vector对象为空 explicit vector(size_type n, const T& v = T()); // 创建有n个元素的vector对 //象 vector(const vector& x); vector(const_iterator first, const_iterator last);【注】:vector存放的所有对象都是经过初始化的。 如果没有指定存储对象的初始值,则对于内置类型将用0初始化; 对于类类型将调用其默认构造函数进行初始化;【注】:如果无默认初始构造函数,则此时必须提供元素初始值。示例:vector<string> v1; // 创建空容器,其对象类型为string类vector<string> v2(10); // 创建有10个具有初始值(即空串)的string类对象的 容器vector<string> v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容 器vector<string> v4(v3.begin(), v3.end()); // v4是与v3相同的容器(完全复制)

5、vector对象的比较:(非成员函数)有六个比较运算符: operator==、 operator!=、 operator<、 operator<=、 operator>、 operator>=。其中, operator==和operator!=:如果vector对象拥有相同的元素个数,并且对应位置的元素全部相等,则两个vector对象相等;否则不等。 operator<、operator<=、operator>、operator>=:采用字典排序策略比较。
6、vector常见操作:①vector头文件: #include <vector>; using namespace std;//命名空间不可少②创建vector对象: vector<int>vec;//声明int一维数组 vector<CvPoint2D32f> Vec32; vector<CvPoint3D64f> Vec3D; vector<vector<CvPoint3D64f>>mVecPoint;//容器的容器, //二维数组③尾部插入数字: vec.push_back(a); Vec32.push_back(cvPoint2D32f(x,y)); Vec3D.push_back(cvPoint3D64f(x,y,z)); mVecPoint.push_back(Vec3D);④使用下标遍历vector容器:下标从0开始; FILE *fp=fopen(“2d.txt”,”wt”); for(inti=0;i<Vec32.size();i++) { fsprintf(fp,”%f %f\n”,Vec32[i].x,Vec32[i].y); } fclose(fp);////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////【注】:遍历容器的容器,遍历二维数组: for (int i=0;i<mVecPoint.size();i++)//先遍历大容器 { for(int j=0;j<mVecPoint [i].size();j++)//再遍历小容器 {cout<<mVecPoint[i][j].x<<mVecPoint[i][j].y<<mVecPoint[i][j].z<<endl; } }定义一个二维的动态数组:vector< vector<int>> Array( 10, vector<int>(0) );for( j = 0; j < 10; j++ ){ for ( i = 0; i< 9; i++ ) { Array[ j ].push_back( i ); }}for( j = 0; j < 10; j++ ){ for(i = 0; i< Array[ j ].size(); i++ ) { cout<< Array[ j ][ i ] << " "; } cout<<endl;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////⑤使用迭代器访问元素:vector<int>::iterator it;for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;⑥插入元素:vec.insert(vec.begin()+i,a);//在第i+1个元素前面插入a,a就变成第i+1个元素了⑦删除元素:vec.erase(vec.begin()+2);删除第三个元素



8、vector排序:①在vector中数据类型为基本类型时,可以调用std::sort()实现升序和降序排序;vector<int> vi ;vi.push_back(1);vi.push_back(3);vi.push_back(0);sort(vi.begin() , vi.end()); //默认:从小到大reverse(vi.begin(),vi.end()) //从大到小////////////////////////////////////////////////////////////////////////////////降序比较:由大到小定义排序比较函数:bool Comp(constint&a,constint&b){ return a>b;}调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
9、②而当vector的数据类型为自定义结构体类型时,怎样实现升序与降序排列呢?有两种方法:方法1:修改结构体或类的定义部分,sort函数实现方法2 :类或结构体外定义函数,使用sort调用函数来实现:如图所示:


