STL容器值vector和deque详解

在这里插入图片描述

来源:微信公众号「编程学习基地」

vector

向量(Vector)是一个封装了动态大小数组的顺序容器

顺序序列

  • 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

动态数组

  • 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。

基本函数

构造函数

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中

增加函数

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)间的数据

删除函数

iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素

遍历函数

reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

判断函数

bool empty() const:判断向量是否为空,若为空,则向量中无元素

大小函数

int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值

其他函数

void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中第n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

简单使用

#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);
	}
	//删除部分数据
	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;
}

排序

头文件

#include <algorithm>

函数

sort(iterator first,iterator last);		//从小到大
reverse(iterator first,iterator last);	//从大到小

示例

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a, int b)
{
    
    
	return a> b; //升序排列,如果改为return a>b,则为降序 
}
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());//从大到小 
	sort(obj.begin(), obj.end(), compare);//从小到大
	for (int i = 0; i<obj.size(); i++)
	{
    
    
		cout << obj[i] << ",";
	}
	return 0;
}

迭代器遍历

#include <vector>
#include <iostream>
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;
}

二维数组两种定义方法

#include <vector>
#include <iostream>
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;
}

deque

deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列*。deque类常用的函数如下。

基本函数

构造函数

deque()://创建一个空deque

deque(int nSize)://创建一个deque,元素个数为nSize

deque(int nSize,const T& t)://创建一个deque,元素个数为nSize,且值均为t

deque(const deque &)://拷贝构造函数

增加函数

void push_front(const T& x)://双端队列头部增加一个元素X

void push_back(const T& x)://双端队列尾部增加一个元素x

iterator insert(iterator it,const T& x)://双端队列中某一元素前增加一个元素x

void insert(iterator it,int n,const T& x)://双端队列中某一元素前增加n个相同的元素x

void insert(iterator it,const_iterator first,const_iteratorlast)://双端队列中某一元素前插入另一个相同类型向量的[forst,last)间的数据

删除函数

Iterator erase(iterator it)://删除双端队列中的某一个元素

Iterator erase(iterator first,iterator last)://删除双端队列中[first,last)中的元素

void pop_front()://删除双端队列中最前一个元素

void pop_back()://删除双端队列中最后一个元素

void clear()://清空双端队列中最后一个元素

遍历函数

reference at(int pos)://返回pos位置元素的引用

reference front()://返回首元素的引用

reference back()://返回尾元素的引用

iterator begin()://返回向量头指针,指向第一个元素

iterator end()://返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)

reverse_iterator rbegin()://反向迭代器,指向最后一个元素

reverse_iterator rend()://反向迭代器,指向第一个元素的前一个元素

判断函数

bool empty() const://向量是否为空,若true,则向量中无元素

大小函数

int size() const://返回向量中元素的个数

int max_size() const://返回最大可允许的双端对了元素数量值

其他函数

void swap(deque&)://交换两个同类型向量的数据

void assign(int n,const T& x)://向量中第n个元素的值设置为x

deque与vector内存分配比较

#include<iostream>  
#include<deque>  
#include<vector>  

using namespace std;
int main()
{
    
    
	vector<int>v(2);
	v[0] = 10;
	int* p = &v[0];
	cout << "vector第一个元素迭代指针*p=" << *p << endl;
	v.push_back(20);
	cout << "vector容量变化后原vector第1个元素迭代指针*p=" << *p << endl;

	deque<int> d(2);
	d[0] = 10;
	int* q = &d[0];
	cout << "deque第一个元素迭代指针*q=" << *q << endl;
	d.push_back(20);
	cout << "deque容量变化后第一个元素迭代器指针*q=" << *q << endl;
}
vector第一个元素迭代指针*p=10
vector容量变化后原vector第1个元素迭代指针*p=-572662307
deque第一个元素迭代指针*q=10
deque容量变化后第一个元素迭代器指针*q=10

该段程序的功能是:deque、vector初始化后大小为2,第一个元素都为10,当通过push_back函数分别给两个容器增加一个元素后,从结果发现原先保持的指针元素值对vector容器前后发生了变化,而对deque容器前后没有发生变化。原因为,在建立vector容器时,一般来说伴随这建立空间->填充数据->重建更大空间->复制原空间数据->删除原空间->添加新数据,如此反复,保证vector始终是一块独立的连续内存空间;在建立deque容器时,一般便随着建立空间->建立数据->建立新空间->填充新数据,如此反复,没有原空间数据的复制和删除过程,是由多个连续的内存空间组成的

使用erase(itertor)后,对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器

猜你喜欢

转载自blog.csdn.net/qq_44519484/article/details/110427572