- vector与常用的数组类似,占用连续内存空间,对随机存取支持很好。可以类似数组用下标访问,也可以类似字符串用
vector.at()
成员函数访问 - vector是尾部开口设计,类似栈。从尾部插入数据效率最高(push_back()函数)
- vector可以自动实现动态空间申请和释放,使用简便
- vector定义于
vector.h
,命名空间std
文章目录
- 一、构造函数
- 二、vector元素操作
- 1、静态vector
- 2、读向量容器元素的操作
- 3、改变数据的成员函数
- 4、描述容器状态的函数
- 5、综合示例
- 三、C++11中vector新特性
- 1、使用列表{}对vector进行初始化赋值
- 2、利用for遍历元素并进行简单操作
- 3. 示例
一、构造函数
编号 | 构造函数 | 解释 |
1 | vector<T>(); | 创建一个没有任何元素的向量 |
2 | vector<T>(vector & _Right); | 创建一个向量,并用另一个向量_Rigth初始化它 |
3 | vector<T>(size_type nSize); | 创建一个大小为nSize的向量 |
4 | vector<T>(size_type nSize , const_type _Val); | 创建一个大小为nSize的向量,全部初始化为Val |
5 | vector<T>(InputIterator _First , InputIterator _last) | 创建一个向量,并以迭代器 _First和 _last之间的元素初始化该向量 |
- T可以是
int
、float
等类型,也可以是自定义的类
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>::iterator v1_Iter, v2_Iter,v3_Iter,v4_Iter,v5_Iter,v6_Iter; //定义vector迭代器
//创建一个长度为3,初始值为0的向量 (构造函数3)
vector<int>v1(3);
cout<<"v1=";
for(v1_Iter=v1.begin();v1_Iter!=v1.end();v1_Iter++)
cout<<" "<<*v1_Iter;
cout<<endl;
//创建一个长度为5,初始值为2的向量 (构造函数4)
vector<int>v2(5,2);
cout<<"v2=";
for(v2_Iter=v2.begin();v2_Iter!=v2.end();v2_Iter++)
cout<<" "<<*v2_Iter;
cout<<endl;
//创建一个int向量,用v2初始化它 (构造函数2)
vector<int>v3(v2);
cout<<"v3=";
for(v3_Iter=v3.begin();v3_Iter!=v3.end();v3_Iter++)
cout<<" "<<*v3_Iter;
cout<<endl;
//创建一个int向量,用v2的部分元素初始化它 (构造函数5)
vector<int>v4(v2.begin()+1,v2.begin()+3);
cout<<"v4=";
for(v4_Iter=v4.begin();v4_Iter!=v4.end();v4_Iter++)
cout<<" "<<*v4_Iter;
cout<<endl;
//创建一个空int向量 (构造函数1)
vector<int>v5;
cout<<"v5=";
for(v5_Iter=v5.begin();v5_Iter!=v5.end();v5_Iter++)
cout<<" "<<*v5_Iter;
cout<<endl;
return 0;
}
- 注意vector重载了运算符
=
,可以用=
在两个对象间复制数据
二、vector元素操作
- 以下介绍部分vector的常用操作,不全
1、静态vector
-
const vector<int> ivec(...);
这样的定义,是指ivec
容器中所有元素都是const
的
const vector<int> ivec(10,10);
ivec[0] = 1; //报错,此处返回的是一个const int
-
vector<const int> ivec(...);
这样的定义,会被编译器当做vector<int>
处理
vector<const int> ivec2(10, 10); //通过
ivec2[0] = 1; //通过
2、读向量容器元素的操作
- 这个表里所有
pos
都是size_type型
变量,调用时写数字,从0开始
函数 | 功能 | 调用示例 |
reference front(); | 返回第一个元素的引用 | v1.front(); |
const_reference front() const; | 返回第一个元素的常引用(const vector) | v1.front(); |
reference back(); | 返回最后一个元素的引用 | v1.back(); |
const_reference back() const; | 返回最后一个元素的常引用(const vector) | v1.back(); |
reference opreator [] (size_type Pos); | 返回Pos指定位置上的元素的引用 | v1[Pos] |
reference at(size_type Pos); | 返回Pos指定位置上的元素的引用 | v1.at(Pos); |
const_reference operator [] (size_type_Pos) const; | 返回Pos指定位置上的元素的常引用(const vector) | v1[Pos] |
const_reference at(size_type Pos) const; | 返回Pos指定位置上的元素的常引用(const vector) | v1.at(Pos); |
- 这个表里所有
pos
·都是iterator
迭代器类型,这几个常用在for循环中遍历vcetor
函数 | 功能 | 调用示例 |
iterator begin() | 返回向量头指针,指向第一个元素 | v1.begin() |
iterator end() | 返回向量尾指针,指向最后一个元素后面 | v1.end() |
reverse_iterator rebegin() | 反向迭代器,指向最后一个元素 | v1.rebegin() |
iterator rend() | 反向迭代器,指向第一个元素前面 | v1.rend() |
3、改变数据的成员函数
- 注意,以下都是vector对象的成员函数
- 这个表里所有
pos
·都是iterator
迭代器类型
函数 | 功能 | 调用示例 |
void clear() | 删除容器中所有元素 | v1.clear() |
iterator erase(pos) | 删除容器中pos位置元素 | v1.erase(v.begin()) |
iterator erase(beg , end) | 删除beg到end-1间所有元素 | v1.erase(v1.begin()+1 , v1.begin()+5) |
iterator insert(iterator pos , const T &elem) | 在pos位置插入一个元素elem | v1.insert(v1.begin()+1 , 200); |
void insert(iterator pos , int n, const T &elem) | 在pos位置前插入元素elem的n个拷贝 | v1.insert(v1.begin()+1 , 3 , 200); |
void insert(iterator pos , const_iterator beg , const_iterator end) | 将另一vector从beg到end-1间所有元素的拷贝插入pos位置前 | v.insert(v.begin(),v.begin()+4,v.begin()+7); |
void push_back(elem) | 将elem的一个拷贝插入容器末尾 | v1.push_back(10); |
void pop_back() | 删除一个末尾元素 | v1.pop_back(): |
void resize(size_type num) | 将元素个数改为num。如果size()增加,由默认构造函数创建新元素 | v1.resize(10); |
void resize(size_type num,elem) | 将元素个数改为num。如果size()增加,由默认构造函数将其初始化为elem | v1.resize(10,0); |
void swap (vector &) | 交换两个同类型向量的数据 | v1.swap(v2) |
void assign(int n , const T &x) | 设置容器大小为n个元素,每个值为x | v1.assign(10 0) |
4、描述容器状态的函数
函数 | 功能 | 调用示例 |
size_type capacity() const; | 返回当前存储空间下,容器可容纳的元素数目(空间由vector自行动态申请,1/2/4/8规律递增) | v1.capacity() |
bool empty() const; | 返回容器是否为空 | v1.empty() |
size_type size() const; | 返回容器中当前存储元素的数目 | v1.size() |
size_type max_zise() const; | 返回可以输入容器的最大元素数目 | v1.max_size() |
5、综合示例
#include<iostream>
#include<vector>
using namespace std;
void print(vector<int> &v)
{
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<endl;
}
int main()
{
vector<int>::iterator v_i;
vector<int>v;
v.push_back(103); cout<<" 当前容量:"<<v.capacity()<<endl;
v.push_back(765); cout<<" 当前容量:"<<v.capacity()<<endl;
v.push_back(208); cout<<" 当前容量:"<<v.capacity()<<endl;
v.push_back(435); cout<<" 当前容量:"<<v.capacity()<<endl;
cout<<endl;
cout<<"利用迭代器打印:";
for(v_i=v.begin();v_i!=v.end();v_i++)
cout<<*v_i<<" "; //迭代器可以看作指针
cout<<endl;
cout<<"利用at打印:";
for(int i=0;i<v.size();i++)
{
int &nValue=v.at(i); //注意at返回一个引用
cout<<nValue<<" ";
}
cout<<endl;
cout<<"利用下标打印:";
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<endl<<endl;
cout<<"在第一位插入100:";
v.insert(v.begin(),100);
print(v);
cout<<" 当前容量:"<<v.capacity()<<endl<<endl;
cout<<"在第二位插入3个200:";
v.insert(v.begin()+1,3,200);
print(v);
cout<<" 当前容量:"<<v.capacity()<<endl<<endl;
cout<<"在第一位插入第五到八位:";
v.insert(v.begin(),v.begin()+4,v.begin()+7);
print(v);
cout<<" 当前容量:"<<v.capacity()<<endl<<endl;
cout<<"删除第一个元素:";
v.erase(v.begin());
print(v);
cout<<endl<<"pop一个元尾部素:"<<v.back()<<endl;
v.pop_back();
print(v);
cout<<endl<<"清空元素:";
v.clear();
print(v);
cout<<" 当前容量:"<<v.capacity()<<endl<<endl;
cout<<endl<<"assign整体赋值:";
v.assign(10,0);
print(v);
cout<<" 当前容量:"<<v.capacity()<<endl<<endl;
return 0;
}
三、C++11中vector新特性
- dev-C++使用C++11特性,需要
工具 -> 编译选项 -> 编译时加入以下命令(打钩)-> 写 “-std=c++11”
1、使用列表{}对vector进行初始化赋值
vector<int>v1={1,2,3};
vector v2{1,2,3};
2、利用for遍历元素并进行简单操作
- 引用传递并进行运算
for(auto &i : v1) i*=i; //遍历元素并进行乘方
- 值传递并进行操作
for(auto i : v1) cout<<i<<endl; //遍历元素并输出
3. 示例
#include <iostream>
#include <vector>
using namespace std;
#define print(V) for(auto i:V) {cout<<i<<" ";} cout<<endl; //使用新特性遍历 & 打印元素
int main()
{
//使用新特性初始化vector向量
vector<int>v1={1,2,3,4};
print(v1);
//使用新特性初始化vector向量
vector<int>v2{4,3,2,1};
print(v2);
//遍历v1做乘方
for(auto &i : v1) i*=i;
print(v1);
return 0;
}