1. 简介
在c++中,vector是一个十分有用的容器。
作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
2. 使用注意
1、如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;
2、Vector作为函数的参数或者返回值时,需要注意它的写法:
1
| double Distance(vector<int>&a, vector<int>&b)
|
3. 基本操作
3.1 头文件
3.2 创建vector对象
1 2 3 4 5 6 7
| vector<int> v1; vector<int> v2(v1); vector<int> v2 = v1; vector<int> v3(n, val); vector<int> v4(n); vector<int> v5 {1, 2, 3} vector<int> v5 = {1, 2, 3}
|
3.3 尾部插入元素 push_back()
3.4 尾部删除元素 pop_back()
3.5 使用下标访问元素[]
3.6 使用at()
方法访问
1
| cout << vec.at(0) << endl;
|
3.7 使用迭代器访问元素
1 2 3
| vector<int>::iterator it; for(it=vec.begin(); it!=vec.end(); it++) cout << *it << endl;
|
3.8 插入元素 insert()
1
| vec.insert(vec.begin()+i, a);
|
3.9 删除元素 erase()
1 2
| vec.erase(vec.begin()+2); vec.erase(vec.begin()+i, vec.end()+j);
|
注意:size()
表示vector实际存储元素个数,capacity()
表示vector容量大小,即分配的存储空间的大小。举例记忆:一间房间有100个座位(capacity),当前只坐了40人(size)。
3.10 vectors实际存储元素个数 size()
3.11 vectors容量大小 capacity()
3.12 清空 clear()
3.13 使用 reverse()
将元素翻转
1 2 3
| #include <algorithm> reverse(vec.begin(), vec.end());
|
3.14 swap()
交换 vector
1 2 3
| vector<int> a(3, 100); vector<int> b(5, 100); a.swap(b);
|
3.15 sort()
排序
1 2 3 4 5 6 7 8
| #include <algorithm> sort(vec.begin(),vec.end());
bool Comp(const int &a,const int &b) { return a>b; }
|
注意:vector提供了两个方法 resize()
和 reserve()
分别对 size()
和 capacity()
进行操作.
Reference:C++基础篇 – vector的resize函数和reserve函数
3.16 改变vector的大小 resize()
1 2 3 4 5 6
| vector<int> vec; vec.resize(5); vec.resize(8, 35); for (int i=0;i<vec.size();i++) std::cout << ' ' << vec[i];
|
1 2 3 4 5 6 7
| 1、resize方法被用来改变vector的大小,即vector中元素的数量,我们可以说,resize方法改变了容器的大小,且创建了容器中的对象;
2、如果resize中所指定的n小于vector中当前的元素数量,则会删除vector中多于n的元素,使vector得大小变为n;
3、如果所指定的n大于vector中当前的元素数量,则会在vector当前的尾部插入适量的元素,使得vector的大小变为n,在这里,如果为resize方法指定了第二个参数,则会把后插入的元素值初始化为该指定值,如果没有为resize指定第二个参数,则会把新插入的元素初始化为默认的初始值;
4、如果resize所指定的n不仅大于vector中当前的元素数量,还大于vector当前的capacity容量值时,则会自动为vector重新分配存储空间;
|
3.17 改变vector容量的大小 reserve()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <iostream> #include <vector> using namespace std; int main() { vector<int> vect; vect.reserve(5); vect.push_back(1); vect.push_back(2); vect.push_back(3); vect.push_back(4); cout << vect.size() << endl; cout << vect.capacity() << endl; vect.push_back(5); vect.push_back(6); cout << "size1 = " << vect.size() << endl; cout << "capacity1 = " << vect.capacity() << endl; vect.push_back(7); vect.push_back(8); cout << "size1_1 = " << vect.size() << endl; cout << "capacity1_1 = " << vect.capacity() << endl; vect.reserve(3); cout << "size2 = " << vect.size() << endl; cout << "capacity2 = " << vect.capacity() << endl; vect.reserve(12); cout << "size3 = " << vect.size() << endl; cout << "capacity3 = " << vect.capacity() << endl; return 0; }
|
1 2 3 4 5
| 1、reserve方法被用来重新分配vector的容量大小;
2、只有当所申请的容量大小n大于vector的当前容量时,才会重新为vector分配存储空间;
3、reserve方法对于vector的大小(即size)没有任何影响;
|
4.一维数组的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <iostream> #include <cstdio> #include <vector> using namespace std; int main() { vector<int> a; a.push_back(1); a.push_back(2); cout << a[0] << endl; cout << a.at(1) << endl; for(vector<int>::iterator it = a.begin(); it != a.end(); it++) cout << *it << endl; }
|
5.二维数组的使用
这里简单叙述一下C++ 构建二维动态数组
1 2 3 4
| int **p; p = new int*[10]; for (int i = 0; i < 10; ++i) p[i] = new int[5];
|
1. 初始化
(1)直接使用初始化方式
1 2
| vector<vector<int> > a(5, vector<int>(3, 0));
|
(2)先定义好二维数组结构,再直接赋值
1 2 3 4 5 6 7 8 9 10
|
int i, j; vector<vector<int> > array(5); for (i = 0; i < array.size(); i++) array[i].resize(3);
for(i = 0; i < array.size(); i++) for (j = 0; j < array[0].size();j++) array[i][j] = (i+1)*(j+1);
|
(3)利用Vector的push_back函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| vector<vector<int> > vec;
vector<int> a; a.push_back(1); a.push_back(2); a.push_back(3);
vector<int> b; b.push_back(4); b.push_back(5); b.push_back(6);
vec.push_back(a); vec.push_back(b);
|
2. 遍历
(1)利用迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void reverse_with_iterator(vector<vector<int>> vec) { if (vec.empty()) { cout << "The vector is empty!" << endl; return; }
vector<int>::iterator it; vector<vector<int>>::iterator iter; vector<int> vec_tmp;
cout << "Use iterator : " << endl; for(iter = vec.begin(); iter != vec.end(); iter++) { vec_tmp = *iter; for(it = vec_tmp.begin(); it != vec_tmp.end(); it++) cout << *it << " "; cout << endl; } }
|
(2)得到行、列大小,利用下标进行遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void reverse_with_index(vector<vector<int>> vec) { if (vec.empty()) { cout << "The vector is empty!" << endl; return; }
int i,j; cout << "Use index : " << endl; for (i = 0; i < vec.size(); i++) { for(j = 0; j < vec[0].size(); j++) cout << vec[i][j] << " "; cout << endl; } }
|
注意: vector的元素不仅仅可以是int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace std; typedef struct rect { int id; int length; int width; bool operator< (const rect &a) const { if(id!=a.id) return id<a.id; else { if(length!=a.length) return length<a.length; else return width<a.width; } } }Rect; int main() { vector<Rect> vec; Rect rect; rect.id=1; rect.length=2; rect.width=3; vec.push_back(rect); vector<Rect>::iterator it=vec.begin(); cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; return 0; }
|
6. begin()
与end()
、front()
与back()
区别
函数原型:
1 2
| iterator begin(); const_iterator begin();
|
功能:返回一个当前vector容器中起始元素的迭代器。
函数原型:
1 2
| iterator end(); const_iterator end();
|
功能:返回一个当前vector容器中末尾元素的迭代器。
函数原型:
1 2
| reference front(); const_reference front();
|
功能: 返回当前vector容器中起始元素的引用。
函数原型:
1 2
| reference back(); const_reference back();
|
功能: 返回当前vector容器中末尾元素的引用。
例题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream> #include <vector> using namespace std; int main() { vector<char> v1; vector<char>::iterator iter1; vector<char>::iterator iter2; v1.push_back('m'); v1.push_back('n'); v1.push_back('o'); v1.push_back('p'); cout << "v1.front() = " << v1.front() << endl; cout << "v1.back() = " << v1.back() << endl; iter1 = v1.begin(); cout << *iter1 << endl; iter2 = v1.end()-1; cout << *iter2 << endl; return 0; }
|
7. resize()
和 reserve()
8. Reference