一、set
- 唯一:set中每个元素值唯一,一个健值只能在set中出现0次或1次;
- 有序:系统根据元素的值自动排序
1.头文件
#include <set>
2.声明
set<int> a;//定义了存放int类型元素的set
size();//返回容器尺寸
clear();//清空集合
3.添加元素
(1)添加单一元素
set<int> a_set;
a_set.insert(1);
(2)添加某一范围元素
set<int> a_set;
vector<int> b_vec;
a_set.insert(b_vec.begin();b_vec.end());
4.遍历元素
set<int> a_set;
for(set<int>::iterator p=a_set.begin();p!=a_set.end();p++)
{
cout<<*p<<endl; //打印set中的元素
}
/*
若元素类型为RTDB_KEY_TYPE
cout<<(*p).FormStringID()<<endl;
*/
5.查找元素
返回给定值的定位器,如果没有找到则返回end();
if((set<int>::iterator p=a_set.find(2))!=a_set.end())
{
cout<<*p<<endl;
}
6.判断容器中是否存在某个值
若容器中存在该值返回1,不存在返回0;
set<int> a_set;
if(a_set.count(1))
{
cout<<"a_set中存在元素1"<<endl;
}
二、vector
1.创建对象
#include <vector>
vector<int> a_vec;
2.初始化
(1)直接初始化
vector<int> a_vec(10); //初始化10个0元素
vector<int> b_vec(10,1); //初始化10个1元素
vector<int> c_vec(a_vec.size(),0); //初始化大小为a_vec,值为0
(2)拷贝函数
a_vec.assign(b_vec.begin(),b_vec.end());//把b_vec拷贝到a_vec
a_vec.assign(b_vec.begin(),b_vec.begin()+9);//把b_vec的前9个拷贝给a_vec
3.插入
(1)末尾插入
a_vec.push_back(1);
(2)任意位置插入
a_vec.insert(a_vec.begin()+2,10); //在位置2处插入加元素10
vector<int> a_vec={4,5,6,2};
a_vec.insert(a_vec.begin()+2,10);//输出:4,5,10,6,2
a_vec.insert(a_vec.begin(),3,15);//输出:15,15,15,4,5,10,6,2
4.遍历元素
(1)下标访问
for(int i=0;i<a_vec.size();i++)
{
cout<<a_vec[i]<<end;
}
(2)迭代器访问
for(vector<int>::iterator vec_p=a_vec.begin();vec_p!=a_vec.end();vec_p++)
{
cout<<*vec_p<<endl; //遍历打印a_vec中元素
}
5.元素求和
#include<numeric>
vector<int> a_vec;
int sum=accumulate(a_vec.begin(),a_vec.begin()+n,0);
/*
前两个元素为代求和的始末位置,第三个元素为sum的初始值。
*/
6.查找
find用法待补充
三、map
唯一:
有序:
map_1.begin()->first; //返回map中第一个元素的key值
map_1.begin()->second; //返回map中第一个元素的value
map_1.clear(); //清空
map_1.empty(); //判断容器是否为空,为空返回1,不为空返回0;
map_1.size(); //返回容器的元素个数
1.创建对象
#include<map>
map<int,long> a_map;
map<long,vector<float> > b_map;
map<long,map<long,vector<int> > > c_map;
map<long,vector<p_stru>>::iterator p=map.begin(); //带有结构体的map赋初值
2.查找
(1)根据关键字返回值
map<int,int> a_map;
int result=a_map[key]; //返回a_map中key对应的健值,若找不到健,则创建关键字key
(2)查找find/count
在容器中找关键字,返回该元素的迭代器,找不到返回map.end();
map<long,float> a_map;
if(a_map.find(key1)!=a_map.end())
{
cout<<"在a_map中找到关键字key1"<<endl;
}
map<long,float> a_map;
if(a_map.count("a"))
{
a_map中包含字符"a";
}
3.插入/修改
map<long,float> c_map;
c_map[123]=3.23;
c_map[健]=值;
4.遍历
a.单层map遍历
map<long,long> a_map;
for(map<long,long>::iterator mp=a_map.begin();mp!=a_map.end();mp++)
{
cout<<"a_map的健="<<mp->first<<"; 对应的值="<<mp->second<<endl;
}
map<long,vector<long> > a_map;
for(map<long,vector<long>>::iterator mp=a_map.begin();mp!=a_map.end();mp++)
{
cout<<"a_map的健="<<mp->first<<endl;
for(int i=0;i<(mp->second).size();i++)
{
cout<<(mp->second)[i]<<endl;
}
}
b.双层map遍历
map<long,map<long,vector<int>>> a_map;
for(map<long,map<long,vector<int>>>::iterator mp=a_map.begin();mp!=a_map.end();mp++)
{
cout<<"外部的健="<<mp->first<<endl;
for(map<long,vector<int>>::iterator mp2=(mp->second).begin();mp2!=(mp->second).end();mp2++)
{
cout<<"内部的map健="<<mp2->first<<endl;
for(int i=0;i<(mp2->second).size();i++)
{
cout<<(mp2->second)[i]<<endl;
}
}
}
5.判断是否存在
map中含有key返回1;不存在返回0;
if(a_map.count("a"))
{
cout<<"a_map中含有a<<endl;
}
四、一些函数
1.includes
includes函数是判断一个升序数组是否被另一个升序数组包含。也是个求是否为子序列问题。
例如:arr1=[1,2,3,4],arr2=[2,3],则数组arr1包含数组arr2,arr2是arr1的子序列,若arr2=[2,5],则数组arr1不包含数组arr2,arr2不是arr1的子序列。
注意:前提是这两个数组都是升序排列的!才能用includes函数。
first1和last1是包含数组的起始地址和尾地址,first2和last2是被包含数组的起始地址和尾地址。
情况1:arr1 = [3,5,7,9],arr2 = [5,9]
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> arr1{ 3, 5, 7, 9 };
vector<int> arr2{ 5, 9 };
if (includes(arr1.begin(), arr1.end(), arr2.begin(), arr2.end()))
cout << "arr1 contains arr2\n";
else
cout << "arr1 doesn't contain arr2\n";
return 0;
}
输出:
arr1 contains arr2
情况2:arr2 = [3,5,7,9],arr2 = [9,5]
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> arr1{ 3, 5, 7, 9 };
vector<int> arr2{ 9, 5 };
if (includes(arr1.begin(), arr1.end(), arr2.begin(), arr2.end()))
cout << "arr1 contains arr2\n";
else
cout << "arr1 doesn't contain arr2\n";
return 0;
}
输出
arr1 doesn't contain arr2
情况3:arr2 = [3,5,7,9],arr2 = [5,8]
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> arr1{ 3, 5, 7, 9 };
vector<int> arr2{ 5, 8 };
if (includes(arr1.begin(), arr1.end(), arr2.begin(), arr2.end()))
cout << "arr1 contains arr2\n";
else
cout << "arr1 doesn't contain arr2\n";
return 0;
}
输出:
arr1 doesn't contain arr2