向量(Vector)是一个封装了动态大小数组的顺序容器ios
顺序序列数组
动态数组函数
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; }
头文件spa
#include <algorithm>
函数指针
sort(iterator first,iterator last); //从小到大 reverse(iterator first,iterator last); //从大到小
示例code
#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容器为一个给定类型的元素进行线性处理,像向量同样,它可以快速地随机访问任一个元素,而且可以高效地插入和删除容器的尾部元素。但它又与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
#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会返回下一个有效的迭代器内存