IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 浅谈vector -> 正文阅读

[C++知识库]浅谈vector

一 什么是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):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator 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个元素的值为x
  • void assign(const_iterator first,const_iterator last):向量中[first,last]中元素设置成当前向量元素

8 All In All

  1. push_back 在数组的最后添加一个数据

  2. pop_back 去掉数组的最后一个数据

  3. at 得到编号位置的数据

  4. begin 得到数组头的指针

  5. end 得到数组的最后一个单元+1的指针

  6. front 得到数组头的引用

  7. back 得到数组的最后一个单元的引用

  8. max_size 得到vector最大可以是多大

  9. capacity 当前vector分配的大小

  10. size 当前使用数据的大小

  11. resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

  12. reserve 改变当前vecotr所分配空间的大小

  13. erase 删除指针指向的数据项

  14. clear 清空当前的vector

  15. rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

  16. rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

  17. empty 判断vector是否为空

  18. 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 个副本。

[注意]

  1. 若要创建非空的 vector 对象,必须给出初始化元素的值;

  2. 当把一个 vector 对象复制到另一个 vector 对象时,新复制的 vector 中每一个元素都初始化为原 vectors 中相应元素的副本。但这两个 vector 对象必须保存同一种元素类型;

  3. 可以用元素个数和元素值对 vector 对象进行初始化。构造函数用元素个数来决定 vector 对象保存元素的个数,元素值指定每个元素的初始值

  1. Vector<类型>标识符
  2. Vector<类型>标识符(最大容量)
  3. Vector<类型>标识符(最大容量,初始所有值)
  4. Int i[5]={1,2,3,4,5}
    Vector<类型>vi(I,i+2);//得到i索引值为3以后的值
  5. Vector< vector< int> >v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过

vector对象动态增长:

vector 对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。

注意:因为 vector 增长的效率高,在元素值已知的情况下,最好是动态地添加元素。

实例:

vectortest;//建立一个vector,int为数组元素的数据类型,test为动态数组名

简单的使用方法如下:

vector<int>test;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是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;  
  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,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注意事项:

  1. 如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;

  2. 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;//创建一个向量存储容器 int
    for(int i=0;i<10;i++) {// push_back(elem)在数组最后添加数据 
        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++) {//size()容器中实际数据个数
        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,
  1. 注意 sort 需要头文件 #include

  2. 如果想 sort 来降序,可重写 sort

bool cmp(int a,int b) { 
    return a< 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); //定义二维动态数组大小5行     
	for(int i =0; i< obj.size(); i++) {         
	//动态二维数组为5行6列,值全为0    
		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)); //定义二维动态数组5行6列     
	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 

本文转载修改于网络,侵删

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:14:51  更:2022-05-11 16:15:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:53:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码