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会返回下一个有效的迭代器