1. 简介
vector是动态数组,其大小可以实时的进行调整,在调整的时候vector回去申请一块内存,而不是逐个的去申请;内存是连续的;
头文件和结构
#include <vector> \\头文件
template<
class T,
class Allocator = std::allocator<T>
> class vector;
2. 初始化
初始化分为直接初始化、拷贝初始化、赋值初始化等
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
template<typename T>
void showInfo(T &t)
{
for(auto &au : t)
{
std::cout<<au<<" ";
}
std::cout<<std::endl;
}
int main(int argc, char *argv[])
{
std::vector<int32_t> v1;
v1 = {11,21,31,41,51,61};
showInfo(v1);
std::vector<int32_t> v2{111,222,333};
showInfo(v2);
std::vector<int32_t> v3 = v1;
showInfo(v3);
std::vector<int32_t> v4 = {666,7777,888};
showInfo(v4);
return 0;
}
输出
11 21 31 41 51 61
111 222 333
11 21 31 41 51 61
666 7777 888
3. 使用
3.1 元素访问
方法 | 说明 |
---|---|
[] 或 at() | 下标访问 |
front | 数组头元素 |
back | 数组尾元素 |
data | 返回元素类型的指针 |
empty | 数组判空 |
size | 数组大小 |
max_size | 最大容量 |
reserve | 改变容量 |
capacity | 当前容量 |
resize | 改变大小 |
shrink_to_fit | 改变vector所占内存的大小,减少到size的大小 |
clear | 清空size大小,不改变capacity |
示例
int main(int argc, char *argv[])
{
//元素访问 at operator[] front back data
std::vector<std::string> v1{"c++","c","java","python"};
std::cout<<"at() "<<v1.at(2)<<std::endl;
std::cout<<"[] "<<v1[2]<<std::endl;
std::cout<<"front "<<v1.front()<<std::endl;
std::cout<<"back "<<v1.back()<<std::endl;
std::string *pStr = v1.data();
std::cout<<*pStr<<std::endl;
if(v1.empty())
{
std::cout<<"empty"<<std::endl;
}
else{
std::cout<<"not empty"<<std::endl;
}
std::cout<<"size "<<v1.size()<<std::endl;
std::cout<<"max_size "<<v1.max_size()<<std::endl;
std::cout<<"capacity "<<v1.capacity()<<std::endl<<std::endl;
v1.reserve(101); //改变capacity的大小,size不变
std::cout<<"(reserve)size "<<v1.size()<<std::endl;
std::cout<<"(reserve)max_size "<<v1.max_size()<<std::endl;
std::cout<<"(reserve)capacity "<<v1.capacity()<<std::endl<<std::endl;
v1.resize(1000); //改变size的大小;size和capacity都会改变
std::cout<<"(resize)size "<<v1.size()<<std::endl;
std::cout<<"(resize)max_size "<<v1.max_size()<<std::endl;
std::cout<<"(resize)capacity "<<v1.capacity()<<std::endl<<std::endl;
v1.clear(); //情况size的大小,但是不改变capacity
std::cout<<"(clear)size "<<v1.size()<<std::endl;
std::cout<<"(clear)max_size "<<v1.max_size()<<std::endl;
std::cout<<"(clear)capacity "<<v1.capacity()<<std::endl<<std::endl;
v1.shrink_to_fit(); //减少到size的大小,不会小于size
std::cout<<"(shrink_to_fit)size "<<v1.size()<<std::endl;
std::cout<<"(shrink_to_fit)max_size "<<v1.max_size()<<std::endl;
std::cout<<"(shrink_to_fit)capacity "<<v1.capacity()<<std::endl<<std::endl;
return 0;
}
结果
at() java
[] java
front c++
back python
c++
not empty
size 4
max_size 576460752303423487
capacity 4
(reserve)size 4
(reserve)max_size 576460752303423487
(reserve)capacity 101
(resize)size 1000
(resize)max_size 576460752303423487
(resize)capacity 1000
(clear)size 0
(clear)max_size 576460752303423487
(clear)capacity 1000
(shrink_to_fit)size 0
(shrink_to_fit)max_size 576460752303423487
(shrink_to_fit)capacity 0
3.2 元素修改
方法 | 说明 |
---|---|
insert | 插入元素,可以是任意位置,可以插入多个元素 |
emplace | 插入元素,可以是任意位置,只能插入一个元素 |
erase | 删除元素,可以是任意位置 |
push_back | 数组尾部插入元素,先复制元素,在将元素插入到尾部 |
emplace_back | 数组尾部插入元素,直接在数组尾部创建元素 |
pop_back | 删除队尾元素 |
swap | 交换两个vector的内容 |
assign | 重新对vector赋值 |
get_allocator | 返回内存分配器 |
示例
int main(int argc, char *argv[])
{
//元素修改 insert emplace erase push_back emplace_back pop_back swap
std::vector<std::string> v1{"c++","c","java","python"};
//1.元素插入,插入完全的对象
//v1.insert(v1.begin() + 1,"shell");
//v1.insert(v1.begin(),"shell"); //插入到数组头
v1.insert(v1.end(),"shell"); //插入到数组尾
showInfo(v1);
//2.emplace 插入,先构造,再插入
v1.emplace(v1.begin(),"PHP");
showInfo(v1);
//3.erase 元素删除,删除指定位置的数组
//v1.erase(v1.begin());
//v1.erase(v1.end());
v1.erase(v1.begin() + 1);
showInfo(v1);
//4.push_back(先创建元素,在将元素拷贝或复制到容器) 和 emplace_back(直接在容器尾部创建元素,省去了拷贝或移动的过程)
v1.push_back("SQL");
v1.emplace_back("PG");
showInfo(v1);
//5.pop_back 删除数组尾部元素
v1.pop_back();
showInfo(v1);
//6.swap vector交换
std::vector<std::string> v2{"R", "matlab"};
v1.swap(v2);
showInfo(v1);
showInfo(v2);
//7.插入多个元素
v1.insert(v1.begin()+1,v2.begin(),v2.end());
showInfo(v1);
//8.assgin 对vector重新赋值
v1.assign(2, "a");
showInfo(v1);
return 0;
}
结果
c++ c java python shell
PHP c++ c java python shell
PHP c java python shell
PHP c java python shell SQL PG
PHP c java python shell SQL
R matlab
PHP c java python shell SQL
R PHP c java python shell SQL matlab
a a
3.3 迭代器
迭代器最好结合STL中的算法一起使用;迭代器的返回值最好用auto接受;
迭代器的类型包括:iterator、const_iterator、reverse_iterator和const_reverse_iterator
方法 | 说明 |
---|---|
begin | 返回数组的头元素(迭代器),其值可修改 |
end | 返回数组的尾元素(迭代器),其值可修改 |
cbegin | 返回数组的头元素(迭代器),其值不可修改,const属性 |
cend | 返回数组的尾元素(迭代器),其值不可修改,const属性 |
rbegin | 反序返回数组的头元素(迭代器),其值可修改,同end() |
rend | 反序返回数组的尾元素(迭代器),其值可修改,同begin() |
crbegin | 反序返回数组的头元素(迭代器),其值不可修改,同cend,const属性 |
crend | 反序返回数组的头元素(迭代器),其值不可修改,同cbegin,const属性 |
迭代器的使用大同小异,和array的使用类似