C++ STL vector容器使用教程

引用头文件

#include <vector>

初始化赋值

1. 一维 vector

  1. 使用构造函数初始化
//全部初始化为零
vector<int> vec(10, 0);
//全部初始化未指定赋值
vector<int> vec(10);
  1. 拷贝复制
vector<int> list2(list1);
or
vector<int> list2 = list1;
  1. 直接初始化赋值
vector<int> vec = {1, 2, 3};
  1. 使用数组初始化赋值
int arr[] = {11, 32, 41, 25, 67, 100, 88, 233}; // 列表初始化内置数组

// 指出拷贝区域范围,使用数组初始化 vector 对象
vector<int> iv(begin(arr), end(arr));  // 遍历 iv 数据:11 32 41 25 67 100 88 233
vector<int> jv(arr + 2, arr + 7);      // 遍历 iv 数据:41 25 67 100 88

2. 二维 vector

  1. 使用构造函数初始化
//10行6列,全部初始化为零
vector<vector<int>> vec(10, vector<int>(6, 0));
  1. 拷贝复制
vector<vector<int>> vec(vec1);
  1. 直接初始化赋值

vector<vector<int>> vec = {
    {1, 2, 3},
    {4, 5, 6},
};
  1. 使用数组初始化赋值
// 初始化一个 二维vector 行row,第二个参数为一维vector;
vector<vector<int> > vecto(row,vector<int>(vt[0].begin()+1,vt[0].begin()+3));

遍历 vector 容器

1. 下标索引遍历

void PrintfVector(vector<int> v)
{
    for(unsigned int i = 0; i < v.size(); ++i) {
		cout<<v[i]<<" ";
	}
	cout<<endl;
}

2. 迭代器遍历

void PrintfVector(vector<int> v)
{
	// 注:如果参数为const vector<int> 需要用const_iterator
	// vector<int>::const_iterator iter=v.begin();
	
	for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	{
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

3. auto

void PrintfVector(vector<int> v)
{
	// 注:如果参数为const vector<int> 需要用const_iterator
	// vector<int>::const_iterator iter=v.begin();
	
	for(auto it = v.begin(); it != v.end(); ++it)
	{
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

4. range for循环

void PrintfVector(vector<int> v)
{
	// 注:如果参数为const vector<int> 需要用const_iterator
	// vector<int>::const_iterator iter=v.begin();
	
	for(auto val : v)
	{
		cout<<( val )<<" ";
	}
	cout<<endl;
}

5. for_each

for_each(iterator beg, iterator end, _callback);

vector<int> v = {3,5,1,7,10};   // vector容器
 
auto print = [](const auto& x)  // 定义一个lambda表达式
{
    cout << x << ",";
};
for_each(cbegin(v), cend(v), print);// for_each算法
 
for_each(                      // for_each算法,内部定义lambda表达式
    cbegin(v), cend(v),        // 获取常量迭代器
    [](const auto& x)          // 匿名lambda表达式
    {
        cout << x << ",";
    }
);

迭代器

vector 迭代器支持 ++ -- +i -i 操作

vector 常用方法

方法说明
at(n)返回对向量中位置 n 处的元素
back()返回对向量最后一个元素
front()返回对向量第一个元素
begin()返回指向向量第一个元素的随机访问迭代器
end()返回一个迭代器,它指向向量容器中的 past-the-end 元素
cbegin()返回指向向量开头的常量随机访问迭代器
cend()返回指向 past-the-end 的常量随机访问迭代器
rbegin()返回一个反向迭代器,它指向向量的最后一个元素
rend()返回一个反向迭代器,它指向向量的反向端
empty()测试向量是否为空
erase(v.begin())从向量中删除单个元素
insert(v.begin(), value)从向量中插入单个元素
pop_back( )从向量中删除最后一个元素并将向量的大小减小一
push_back( )在向量末尾插入新元素并将向量的大小增加一
size( )返回向量中存在的元素数

判断 vector 是否空

v.empty() 如果 v 为空,则返回 true, 否则返回 false

返回数组长度

v.size(a) 返回数组 v 的长度

尾部插入元素

v.push_back(a) 将元素a插入到数组v的尾部

删除尾部元素

v.pop_back() 删除最后一个数据

调整数组大小

v.resize(n,m) 重新调整数组大小为n,如果n比原来的小则删除多余信息;如果n比原来大则新增部分初始化为m,其中m可以省略

获取迭代器

方法说明
v.begin()返回数组v首元素(也就是v[0])的迭代器
v.end()返回数组v末尾元素下一个元素的迭代器,为空指针,不指向任何元素
v.cbegin() 和 v.cend()C++11新增,它们返回一个const的迭代器,不能用于修改元素

插入元素

插入位置需为:迭代器类型

方法说明
v.insert(pos,elem)在pos位置插入一个elem拷贝,传回新数据位置。
v.insert(pos,n,elem)在pos位置插入n个elem数据。无返回值。
v.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据。无返回值。
v.insert(v.begin(), 2);
v.insert(v.begin(), 4, 5);

vector<int> v1 = {2, 3, 4, 5};
vector<int> v2 = {1};
v2.insert(v2.begin() + 1, v1.begin(), v1.begin() + 3);

删除元素

方法说明
v.erase(pos) 删除pos位置的数据,传回下一个数据的位置
v.erase(beg,end)删除[beg,end)区间的数据,传回下一个数据的位置
v.erase(v.begin(), v.begin() + 2);

排序 sort

#include<algorithm>

sort(vec.begin(),vec.end()); // (默认是按升序排列,即从小到大)

bool Comp(const int &a,const int &b)  
{  
    return a>b;  
}  
sort(vec.begin(),vec.end(),Comp) // 这样就降序排序。

翻转 reverse

#include<algorithm>

// 将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)
reverse(vec.begin(),vec.end()); 

判断 vector 中包含某一元素

#include<algorithm>

// 如果count返回0,则表示不存在该元素。 在 v 中 查找 key
if(count(v.begin(), v.end(), key))

if(find(v.begin(), v.end(), key) != v.end())
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值