一 什么是vector?
**向量(Vector)**是一个封装了动态大小数组的顺序容器(Sequence Container)
跟任意其它类型容器一样,它能够存放各种类型的对象
可以简单的认为,向量是一个能够存放任意类型的动态数组
二 容器特性
1 顺序序列
顺序容器中的元素按照严格的线性顺序排序
可以通过元素在序列中的位置访问对应的元素
2 动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作
提供了在序列末尾相对快速地添加/删除元素的操作
3 能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求
三 基本函数实现
1 构造函数
vector() :创建一个空vector vector(int nSize) :创建一个vector ,元素个数为nSize vector(int nSize,const t& t) :创建一个vector,元素个数为nSize ,且值均为t vector(const vector&) :复制构造函数vector(begin,end) :复制[begin,end] 区间内另一个数组的元素到vector 中
2 增加函数
void push_back(const T& x) :向量尾部增加一个元素Xiterator insert(iterator it,const T& x) :向量中迭代器指向元素前增加一个元素xiterator insert(iterator it,int n,const T& x) :向量中迭代器指向元素前增加n个相同的元素xiterator insert(iterator it,const_iterator first,const_iterator last) :向量中迭代器指向元素前插入另一个相同类型向量的[first,last]间的数据
3 删除函数
iterator erase(iterator it) :删除向量中迭代器指向元素iterator erase(iterator first,iterator last) :删除向量中[first,last)中元素void pop_back() :删除向量中最后一个元素void clear() :清空向量中所有元素
4 遍历函数
reference at(int pos) :返回pos位置元素的引用reference front() :返回首元素的引用reference back() :返回尾元素的引用iterator begin() :返回向量头指针,指向第一个元素iterator end() :返回向量尾指针,指向向量最后一个元素的下一个位置reverse_iterator rbegin() :反向迭代器,指向最后一个元素reverse_iterator rend() :反向迭代器,指向第一个元素之前的位置
5 判断函数
bool empty() const :判断向量是否为空,若为空,则向量中无元素
6 大小函数
int size() const :返回向量中元素的个数int capacity() const :返回当前向量所能容纳的最大元素值int max_size() const :返回最大可允许的vector元素数量值
7 其他函数
void swap(vector&) :交换两个同类型向量的数据void assign(int n,const T& x) :设置向量中前n个元素的值为xvoid assign(const_iterator first,const_iterator last) :向量中[first,last]中元素设置成当前向量元素
8 All In All
-
push_back 在数组的最后添加一个数据 -
pop_back 去掉数组的最后一个数据 -
at 得到编号位置的数据 -
begin 得到数组头的指针 -
end 得到数组的最后一个单元+1的指针 -
front 得到数组头的引用 -
back 得到数组的最后一个单元的引用 -
max_size 得到vector最大可以是多大 -
capacity 当前vector分配的大小 -
size 当前使用数据的大小 -
resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值 -
reserve 改变当前vecotr所分配空间的大小 -
erase 删除指针指向的数据项 -
clear 清空当前的vector -
rbegin 将vector反转后的开始指针返回(其实就是原来的end-1) -
rend 将vector反转构的结束指针返回(其实就是原来的begin-1) -
empty 判断vector是否为空 -
swap 与另一个vector交换数据
四、基本用法
#include <vector>
//用万能头<bits/stdc++.h>也行
using namespace std;
五、简单介绍
vector对象的定义和初始化
同样的,使用前,导入头文件 #include 可以使用using声明:using std::vector
vector 是一个类模板(class template)
使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型
因此,我们可以定义保存 string 对象的 vector
或保存 int 值的 vector
又或是保存自定义的类类型对象(如 Sales_items 对象)的 vector
声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板
以 vector 为例,必须说明 vector 保存何种对象的类型
通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:
vector v1; | 保存类型为 T 对象。默认构造函数 v1 为空。 |
---|
vector v2(v1); | v2 是 v1 的一个副本。 | vector v3(n, i); | v3 包含 n 个值为 i 的元素。 | vector v4(n); | v4 含有值初始化的元素的 n 个副本。 |
[注意]
-
若要创建非空的 vector 对象,必须给出初始化元素的值; -
当把一个 vector 对象复制到另一个 vector 对象时,新复制的 vector 中每一个元素都初始化为原 vectors 中相应元素的副本。但这两个 vector 对象必须保存同一种元素类型; -
可以用元素个数和元素值对 vector 对象进行初始化。构造函数用元素个数来决定 vector 对象保存元素的个数,元素值指定每个元素的初始值
- Vector<类型>标识符
- Vector<类型>标识符(最大容量)
- Vector<类型>标识符(最大容量,初始所有值)
- Int i[5]={1,2,3,4,5}
Vector<类型>vi(I,i+2);//得到i索引值为3以后的值 - Vector< vector< int> >v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过
vector对象动态增长:
vector 对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。
注意:因为 vector 增长的效率高,在元素值已知的情况下,最好是动态地添加元素。
实例:
vectortest;//建立一个vector,int为数组元素的数据类型,test为动态数组名
简单的使用方法如下:
vector<int>test;
test.push_back(1);
test.push_back(2);
实例:
vector<vector<Point2f> > points;
points[0].size();
1 基本操作
(1)头文件#include<vector> .
(2)创建vector对象,vector<int> vec ;
(3)尾部插入数字:vec.push_back(a) ;
(4)使用下标访问元素,cout<<vec[0]<<endl ;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素:vec.insert(vec.begin()+i,a) ; 在第i+1个元素前面插入a;
(7)删除元素:vec.erase(vec.begin()+2) ; 删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j) ; 删除区间[ i,j-1] 区间从0开始
(8)向量大小: vec.size() ;
(9)清空: vec.clear() ;
特别提示:这里有 begin() 与 end() 函数、front() 与 back() 的差别
2 重要说明
vector 的元素不仅仅可以是 int,double,string 还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
#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;
}
六、实例
使用vector注意事项:
-
如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低; -
Vector 作为函数的参数或者返回值时,需要注意它的写法:
double Distance(vector<int>&a, vector<int>&b)
其中的“&”绝对不能少!!!
1 pop_back()&push_back(elem)实例在容器最后移除和插入数据
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<int>obj;
for(int i=0;i<10;i++) {
obj.push_back(i);
cout<<obj[i]<<",";
}
for(int i=0;i<5;i++) {
obj.pop_back();
}
cout<<"\n"<<endl;
for(int i=0;i<obj.size();i++) {
cout<<obj[i]<<",";
}
return 0;
}
输出结果为:
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,
2 clear()清除容器中所有数据
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int>obj;
for(int i=0;i<10;i++) {//push_back(elem)在数组最后添加数据
obj.push_back(i);
cout<<obj[i]<<",";
}
obj.clear();//清除容器中所以数据
for(int i=0;i<obj.size();i++) {
cout<<obj[i]<<endl;
}
return 0;
}
输出结果为:
0,1,2,3,4,5,6,7,8,9,
3 排序
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
vector<int>obj;
obj.push_back(1);
obj.push_back(3);
obj.push_back(0);
sort(obj.begin(),obj.end());//从小到大
cout<<"从小到大:"<<endl;
for(int i=0;i<obj.size();i++) {
cout<<obj[i]<<",";
}
cout<<"\n"<<endl;
cout<<"从大到小:"<<endl;
reverse(obj.begin(),obj.end());//从大到小
for(int i=0;i<obj.size();i++) {
cout<<obj[i]<<",";
}
return 0;
}
输出结果为:
从小到大:0,1,3,从大到小:3,1,0,
-
注意 sort 需要头文件 #include -
如果想 sort 来降序,可重写 sort
bool cmp(int a,int b) {
return a< b;
}
int a[20]={2,4,1,23,5,76,0,43,24,65};
for(int i=0;i<20;i++)
cout<< a[i]<< endl;
sort(a,a+20,cmp);
4.访问(直接数组访问&迭代器访问)
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() { //顺序访问
vector<int>obj;
for(int i=0;i<10;i++) {
obj.push_back(i);
}
cout<<"直接利用数组:";
for(int i=0;i<10;i++) {//方法一
cout<<obj[i]<<" ";
}
cout<<endl;
cout<<"利用迭代器:" ;
//方法二,使用迭代器将容器中数据输出
vector<int>::iterator it;
//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
for(it=obj.begin();it!=obj.end();it++) {
cout<<*it<<" ";
}
return 0;
}
输出结果为:
直接利用数组:0 1 2 3 4 5 6 7 8 9 利用迭代器:0 1 2 3 4 5 6 7 8 9
5 二维数组两种定义方法(结果一样)
方法一
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N=5, M=6;
vector<vector<int> > obj(N);
for(int i =0; i< obj.size(); i++) {
obj[i].resize(M);
}
for(int i=0; i< obj.size(); i++) {
for(int j=0;j<obj[i].size();j++) {
cout<<obj[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
方法二
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N=5, M=6;
vector<vector<int> > obj(N, vector<int>(M));
for(int i=0; i< obj.size(); i++) {
for(int j=0;j<obj[i].size();j++) {
cout<<obj[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
输出结果为:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
本文转载修改于网络,侵删
|