C++vector类
文章目录
一、vector定义
-
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
-
vector 是定义于名称空间 (namespace ) std 内的模板, 其定义在头文件 < vector > 中。其原型为:
template < class T, class Allocator = allocator < T >> class vector;
二、容器特性
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
三、基本成员函数
1.构造函数
-
无参数 - 构造一个空的vector
vector<类型>();
-
数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector
vector<类型>( size_type num, const TYPE &val );
-
vector(from) - 构造一个与vector from 相同的vector
vector<类型>( const vector &from );
-
迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).
vector<类型>( input_iterator start, input_iterator end );
2.增加函数
-
向量尾部增加一个元素X
void push_back(const T& x);
-
向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,const T& x);
-
向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,int n,const T& x);
-
向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
iterator insert(iterator it,const_iterator first,const_iterator last);
3.删除函数
-
删除向量中迭代器指向元素
iterator erase(iterator it);
-
删除向量中[first,last)中元素
iterator erase(iterator first,iterator last);
-
删除向量中最后一个元素
void pop_back();
-
清空向量中所有元素
void clear();
4.遍历函数
-
返回向量头指针,指向第一个元素
iterator begin();
-
返回向量尾指针,指向向量最后一个元素的下一个位置
iterator end();
-
反向迭代器,指向最后一个元素
reverse_iterator rbegin();
-
反向迭代器,指向第一个元素之前的位置
reverse_iterator rend();
5.大小和容量
-
判断向量是否为空,若为空,则向量中无元素
bool empty() const;
-
返回向量中元素的个数
int size() const;
-
返回当前向量所能容纳的最大元素值
int capacity() const;
-
返回最大可允许的vector元素数量值
int max_size() const;
-
resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val
void resize( size_type size, TYPE val );
-
reserve()函数为当前vector预留至少共容纳size个元素的空间.
void reserve( size_type size );
6.其他函数
-
交换两个同类型向量的数据
void swap(vector&);
-
设置向量中前n个元素的值为x
void assign(int n,const T& x);
-
向量中[first,last)中元素设置成当前向量元素
void assign(const_iterator first,const_iterator last);
-
get_allocator() 函数返回当前vector的内存分配器.
allocator_type get_allocator();
7.元素访问
-
c[index]的返回值是引用类型。该函数既可以取出元素, 也可以对元素赋值,但必须 确定下标是有效的。
-
返回pos位置元素的引用
reference at(int pos);
-
返回首元素的引用
reference front();
-
返回尾元素的引用
reference back();
四、vector 示例程序
-
1.用vector实现二维数组
#include <iostream> #include <vector> using namespace std; int main() { vector<vector<int>> v(3); //v有3个元素,每个元素都是vector<int> 容器 for (int i = 0; i < v.size(); ++i) for (int j = 0; j < 4; ++j) v[i].push_back(j); for (int i = 0; i < v.size(); ++i) { for (int j = 0; j < v[i].size(); ++j) cout << v[i][j] << " "; cout << endl; } return 0; }
程序输出结果:
0 1 2 3
0 1 2 3
0 1 2 3 -
2.vector 示例程序
#include <iostream> #include <vector> using namespace std; template <class T> void PrintVector(T s, T e) { for (; s != e; ++s) cout << *s << " "; cout << endl; } int main() { int a[5] = {1, 2, 3, 4, 5}; vector<int> v(a, a + 5); //将数组a的内容放入v cout << "1) " << v.end() - v.begin() << endl; //两个随机迭代器可以相减,输出 1) 5 cout << "2) "; PrintVector(v.begin(), v.end()); //2) 1 2 3 4 5 v.insert(v.begin() + 2, 13); //在begin()+2位置插入 13 cout << "3) "; PrintVector(v.begin(), v.end()); //3) 1 2 13 3 4 5 v.erase(v.begin() + 2); //删除位于 begin() + 2的元素 cout << "4) "; PrintVector(v.begin(), v.end()); //4) 1 2 3 4 5 vector<int> v2(4, 100); //v2 有4个元素,都是100 v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3); //将v的一段插入v2开头 cout << "5) v2: "; PrintVector(v2.begin(), v2.end()); //5) v2: 2 3 100 100 100 100 v.erase(v.begin() + 1, v.begin() + 3); //删除 v 上的一个区间,即 2,3 cout << "6) "; PrintVector(v.begin(), v.end()); //6) 1 4 5 return 0; }