C++ STL容器(1) : vector

std::vector: 动态连续数组(dynamic contiguous array)
头文件 :#include <vector>
迭代器类型:随机访问迭代器

总结

1.构造函数

	//构造函数
	vector<int> v1();//空构造
	vector<int> v2(10,7);//n个元素构造,10个7
	vector<int> v3(v2.begin(),v2.begin()+5);//区间构造
	vector<int> v4(v3);//拷贝构造
	
	//PS.用{}初始化
	vector<int> v5{1,2,3,4};
	vector<int> v6 = {6,7,8,9};

2.成员函数

	(1)//operator = 
	vector<T> v2 = v1;//将v1的值拷贝到v2中
	
	(2)//assign
	v1.assign(4,5);//赋值,4个5
	v2.assign(v1.begin(),v1.begin()+2);//区间赋值
	
	(3)//Element access
	v.at(1);//取下标为1的元素,越界会抛异常
	v[2];//取下标为2的元素,越界不会抛异常
	v.front();//头元素
	v.back();//尾元素
	
	(4)//Iterators
	v.begin();//起始迭代器
	v.end();//终止迭代器
	v.rbegin();//反向起始迭代器
	v.rend();//反向终止迭代器
	
	(5)//Capacity
	v.reserve(10);//预留空间,10个
	v.empty();//判断是否为空
	v.size();//元素个数
	v.capacity();//总容量
	v.max_size();//最大可能容纳的元素个数
	
	(6)//Modifiers
	v.clear();//清空
	v.insert(v.begin(),10);//在v.begin()位置插入10
	v.insert(v.end(),v_temp.begin(),v_temp.end());//在v.end()位置插入一个区间的元素
	v.emplace(v.begin()+2,20);//在v.begin()+2位置插入20
	v.push_back(30);//在尾部插入30
	v.emplace_back(40);//在尾部插入40
	v.pop_back();//将尾部元素删除
	v.erase(v.begin()+1);//删除在v.begin()+1位置的元素
	v.erase(v.begin(),v.begin()+3);//删除指定区间内的元素
	v.resize(10);//重置v的size为10。若小于原size,舍弃多出来的元素;若大于原size,多出的位置补0.
	v.swap(v_temp);//交换两个同类型vector的元素

3. 非成员函数

	v1 == v2;//判断两个vector容器是否相等
	v1 != v2;//判断是否不相等

4.常用算法

头文件:#include <algorithm>

	(1)//Non-modifying sequence operations
	all_of(v.begin(),v.end(),_Pred);//全部元素符合条件否?
	any_of(v.begin(),v.end(),_Pred);//任一元素符合条件否?
	none_of(v.begin(),v.end(),_Pred);//无元素符合条件否?
	
	count(v.begin(),v.end(),elem);//元素elem出现的次数
	count_if(v.begin(),v.end(),_Pred);//符合条件的元素个数
	
	for_each(v.begin(),v.end(),_Func);//遍历,并可以对每个元素操作
	
	find(v.begin(),v.end(),elem);//查找元素elem第一次出现位置,返回其迭代器
	find_if(v.begin(),v.end(),_Pred);//查找符合条件的元素elem第一次出现位置,返回其迭代器
	find_if_not(v.begin(),v.end(),_Pred);//查找不符合条件的元素elem第一次出现位置,返回其迭代器
	
	(2)//Modifying sequence operations
	copy(v.begin(),v.end()-1,inserter(v_c_dest,v_c_dest.begin()));	//拷贝,将v的指定区间内的元素,通过插值迭代器拷贝到v_c_dest的begin()位置
	fill(v.begin(),v.end()-5,elem);//将指定区间填充为elem
	transform(v.begin(),v.end()-3,inserter(v_t_dest,v_t_dest.begin()),_Func);//搬运,将v的指定区间内的元素,通过插值迭代器搬运到v_t_dest的begin()位置,且可对每个元素操作
	swap(v,v_t_dest);//交换两个vector的所有元素
	reverse(v.begin(),v.end());//反转元素顺序
	random_shuffle(v.begin(),v.end());//随机洗牌,打乱元素顺序,配合srand()使用
	
	(3)//Sorting operations
	is_sorted(v.begin(),v.end());//判断是否按升序排好
	sort(v.begin(),v.end());//排序,默认升序
	sort(v.begin(),v.end(),_Pred);//指定规则排序,一般自定义数据排序需要重载operator < 或 operator >
	
	(4)//Set operations (on sorted ranges)
	set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_inter,v_inter.begin()));//求v1和v2的交集,使用插值迭代器将结果放在v_inter中
	set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_union,v_union.begin()));//求v1和v2的并集,使用插值迭代器将结果放在v_union中	
	set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_diff,v_diff.begin()));//求差集,v1 - v2,使用插值迭代器将结果放在v_diff中	
	includes(v1.begin(),v1.end(),v_inter.begin(),v_inter.end());//判断v_inter是否为v1的子集
	
	(5)//Other operations on sorted ranges
	merge(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_merge,v_merge.begin()));//合并两个容器,使用插值迭代器将结果放入v_merge中
	

模型

图示:
在这里插入图片描述解释:
v 是一个装有int型数据的vector容器。
其全部元素为:10,20,30,40,50.

v.front() == 10;
v.back() == 50;

其迭代器v.begin()指向头元素10的地址,其迭代器v.end()指向尾元素50的下一个(虽然没有)元素地址,故

*v.begin() == 10;
*(v.end() - 1) == 50;

其反向迭代器v.rbegin()指向元素50的地址,其反向迭代器v.rend()指向元素10的下一个(虽然没有)元素地址,故

*v.rbegin() == 50;
*(v.rend() - 1) == 10;

其正向迭代器和反向迭代器都重载了 ++ -- < > == + -等操作符,故

*v.begin()++ == 20;
*(v.end() - 2) == 40;
v.begin() < v.end()  == true;
v.rend() - v.rbegin() == 5;

但是不同类型迭代器不能这么操作

v.rend() - v.begin();//error

对于同类型迭代器 + 没有意义

v.begin() + v.end();//error

实例

1.构造函数

void test01()
{
	//构造函数
	vector<int> v1();//空构造
	vector<int> v2(10,7);//n个元素构造,10个7
	vector<int> v3(v2.begin(),v2.begin()+5);//区间构造
	vector<int> v4(v3);//拷贝构造
	printVectorInt(v2);
	printVectorInt(v3);
	printVectorInt(v4);
}

在这里插入图片描述

2.成员函数

(1)operator =

void test02()
{
	//operator = 
	vector<int> v1(4,6);
	vector<int> v2 = v1;
	printVectorInt(v2);
}

在这里插入图片描述

(2)assign

assign()   //赋值

void test03()
{
	//assign
	vector<int> v1;
	v1.assign(5,5);//给v1赋5个5
	vector<int> v2;
	v2.assign(v1.begin(),v1.begin()+2);//给v2赋一个左闭右开区间的值
	printVectorInt(v1);
	printVectorInt(v2);
}

在这里插入图片描述

(3)Element access

at()         //取指定位置的元素
operator []  //取指定位置的元素
front()         //取头元素
back()         //取尾元素

void test04()
{
	//Element access
	vector<int> v = {1,2,3,4};
	cout<<"v.at(1)   = "<<v.at(1)<<endl;
	cout<<"v[2]      = "<<v[2]<<endl;
	cout<<"v.front() = "<<v.front()<<endl;
	cout<<"v.back()  = "<<v.back()<<endl;
}

在这里插入图片描述

(4)Iterators

begin()   //起始迭代器
end()     //终止迭代器
rbegin()  //反向起始迭代器
rend()     //反向终止迭代器

void test05()
{
	//Iterators
	vector<int> v = {1,2,3,4};
	vector<int>::iterator begin_it = v.begin();
	vector<int>::iterator end_it = v.end();
	vector<int>::reverse_iterator rbegin_it = v.rbegin();
	vector<int>::reverse_iterator rend_it = v.rend();
	cout<<"*begin_it      = "<<*begin_it<<endl;
	cout<<"*(end_it - 2)  = "<<*(end_it - 2)<<endl;
	cout<<"*rbegin_it     = "<<*rbegin_it<<endl;
	cout<<"*(rend_it - 1) = "<<*(rend_it - 1)<<endl;
}

在这里插入图片描述

(5)Capacity

reserve()    //预留空间
empty()      //判断是否为空
size()         //元素个数
capacity()    //容量
max_size()    //最大可能容纳的元素个数

void test06()
{
	//Capacity
	vector<int> v = {1,2,3,4};
	v.reserve(10);
	cout<<"v.empty()    = "<<v.empty()<<endl;
	cout<<"v.size()     = "<<v.size()<<endl;
	cout<<"v.capacity() = "<<v.capacity()<<endl;
	cout<<"v.max_size() = "<<v.max_size()<<endl;
}

在这里插入图片描述

(6)Modifiers

clear()           //清空容器
insert()            //指定位置插入元素
emplace()         //指定位置插入元素
push_back()      //尾部插入元素
emplace_back()   //尾部插入元素
pop_back()       //尾部删除元素
erase()          //删除指定位置的元素
resize()           //重置元素个数
swap()           //和另一容器交换所有元素

void test07()
{
	//Modifiers
	vector<int> v = {1,2,3,4};
	printVectorInt(v);//原始数据

	v.clear();
	
	v.insert(v.begin(),10);
	v.emplace(v.begin(),20);
	v.push_back(30);
	v.emplace_back(40);
	printVectorInt(v);
	
	v.pop_back();
	v.erase(v.begin()+1);
	printVectorInt(v);	
	
	cout<<"v.size() = "<<v.size()<<endl;
	v.resize(10);
	cout<<"v.size() = "<<v.size()<<endl;
	printVectorInt(v);	
	
	vector<int> v_temp = {1,2,3,4,5};
	v.swap(v_temp);
	printVectorInt(v);	
}

在这里插入图片描述

3.非成员函数

(1)operator== & operator !=

void test08()
{
	vector<int> v1 = {1,2,3,4};
	vector<int> v2 = {1,2,3,4};
	vector<int> v3 = {1,2,3};
	cout<<(v1 == v2)<<endl;//1
	cout<<(v1 != v3)<<endl;//1
}

4.常用算法

头文件:#include <algorithm>

(1)Non-modifying sequence operations

all_of() & any_of() & none_of()  //条件符合判断
count() & count_if()           //计数
for_each()               //遍历
find()                  //查找

void test09()
{
	vector<int> v = {6,3,2,4,9,5,6,9,8};
	printVectorInt(v);//原始数据
	
	//条件符合
	cout<<"是否全都是正数     :"<<all_of(v.begin(),v.end(),[](int val){return val > 0;})<<endl;
	cout<<"是否存在大于10的数 :"<<any_of(v.begin(),v.end(),[](int val){return val > 10;})<<endl;
	cout<<"是否连一个7都不存在:"<<none_of(v.begin(),v.end(),[](int val){return val == 7;})<<endl;

	//计数
	cout<<"9 出现次数         :"<<count(v.begin(),v.end(),9)<<endl;;
	cout<<"大于3的元素个数为  :"<<count_if(v.begin(),v.end(),[](int val){return val > 3;})<<endl;

	//遍历,可对每一个元素进行操作
	for_each(v.begin(),v.end(),[](int val){cout<<val+10<<ends;});
	cout<<endl;
	
	//查找
	auto iter = find(v.begin(),v.end(),9);
	cout<<"找到第一个9的下一个元素为:"<<*(iter+1)<<endl;
}

在这里插入图片描述

(2)Modifying sequence operations

copy()            //拷贝
fill()            //填充
transform()        //搬运
swap()            //交换
reverse()          //反转
random_shuffle()   //随机洗牌,打乱元素顺序

#include <iterator>
#include <time.h>
void test10()
{
	vector<int> v = {1,2,3,4,5,6,7,8};
	cout<<"v       :";
	printVectorInt(v);//原始数据
	
	vector<int> v_c_dest;
	copy(v.begin(),v.end()-1,inserter(v_c_dest,v_c_dest.begin()));
	cout<<"v_c_dest:";
	printVectorInt(v_c_dest);
	
	fill(v.begin(),v.end()-5,10);
	cout<<"v       :";
	printVectorInt(v);

	vector<int> v_t_dest;
	transform(v.begin(),v.end()-3,inserter(v_t_dest,v_t_dest.begin()),[&](int val){return val+10;});
	cout<<"v_t_dest:";
	printVectorInt(v_t_dest);

	swap(v,v_t_dest);
	cout<<"v       :";
	printVectorInt(v);

	reverse(v.begin(),v.end());
	cout<<"v       :";
	printVectorInt(v);

	srand(time(nullptr));
	random_shuffle(v.begin(),v.end());
	cout<<"v       :";
	printVectorInt(v);
}

在这里插入图片描述

(3)Sorting operations

is_sorted() //判断是否已按升序排列好
sort()      //排序,默认为升序

#include <functional>
void test11()
{
	vector<int> v = {4,2,1,4,3,6,2,8};
	printVectorInt(v);
	cout<<"v是否按升序排列好了:"<<is_sorted(v.begin(),v.end())<<endl;
	//使用内建函数对象,指定排序规则为降序排列
	sort(v.begin(),v.end(),greater<int>());
	printVectorInt(v);
	cout<<"v是否按升序排列好了:"<<is_sorted(v.begin(),v.end())<<endl;
	//默认规则为升序
	sort(v.begin(),v.end());
	printVectorInt(v);
	cout<<"v是否按升序排列好了:"<<is_sorted(v.begin(),v.end())<<endl;
}

在这里插入图片描述

(4)Set operations (on sorted ranges)

set_intersection()  //交集
set_union()      //并集
set_difference()   //差集
includes()       //判断是否为子集

void test12()
{
	//两容器内元素必须有序
	vector<int> v1{1,3,5,7,7,7};
	vector<int> v2 = {2,4,6,7,7};
	
	vector<int> v_inter;//交集
	vector<int> v_union;//并集
	vector<int> v_diff;//差集
	
	//求交集
	set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_inter,v_inter.begin()));
	printVectorInt(v_inter);
	//求并集
	set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_union,v_union.begin()));
	printVectorInt(v_union);
	//求差集,v1 - v2
	set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_diff,v_diff.begin()));
	printVectorInt(v_diff);
	//判断v_inter是否为v1的子集
	cout<<"v1是否包含全部v_inter : "<<includes(v1.begin(),v1.end(),v_inter.begin(),v_inter.end())<<endl;
}

在这里插入图片描述

(5)Other operations on sorted ranges

merge()  //合并

void test13()
{
	//两容器内元素必须有序
	vector<int> v1{1,3,5,7,7,7};
	vector<int> v2 = {2,4,6,7,7};

	vector<int> v_merge;
	merge(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v_merge,v_merge.begin()));
	printVectorInt(v_merge);
}

在这里插入图片描述

参考资料:
链接: std::vector.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值