C++ Day10 STL02-适配器与算法 (本篇笔记16000字,整理不易,拿去赶快干)

函数对象

概念

重载函数调用运算符的类实例化的对象 , 就叫函数对象 . 又名仿函数
函数对象和 () 触发重载函数调用运算符的执行。
作用 : 为算法提供策略。

示例

class MyPrint
{
public:void operator()(char *s){cout<<s<<endl;}
};
void test01()
{MyPrint ob1;ob1("hello world");MyPrint()("hello world");
}

谓词

概念

返回值为 bool 类型的普通函数 或 仿函数 都叫谓词。
有一个参数 叫 一元谓词。
有二个参数 叫 二元谓词。

示例

1, 使用一元谓词查找大于 30 的数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class GreaterThan30
{
public:bool operator()(int val){return val>30;}
};bool greaterThan30(int val){return val>30;}void test02(){vector<int> v1;v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);v1.push_back(50);//寻找大于30的数vector<int>::iterator ret;//仿函数提供策略 需要函数对象//ret = find_if(v1.begin(), v1.end(), GreaterThan30() );//普通函数提供策略ret = find_if(v1.begin(), v1.end(), greaterThan30 );if(ret != v1.end()){cout<<"找到的值:"<<*ret<<endl;}}

2.使用二元谓词实现排序

void myPrintInt(int val)
{cout<<val<<" ";
}
class MyGreater
{
public:bool operator()(int v1, int v2){return v1>v2;}
};bool myGreater(int v1, int v2){return v1>v2;}void test03(){vector<int> v1;v1.push_back(30);v1.push_back(20);v1.push_back(10);v1.push_back(40);v1.push_back(50);for_each(v1.begin(),v1.end(), myPrintInt);cout<<endl;//更改排序策略//sort(v1.begin(), v1.end(), MyGreater());sort(v1.begin(), v1.end(), myGreater);for_each(v1.begin(),v1.end(), myPrintInt);cout<<endl;
}

内建函数对象

概念

        STL提供的函数对象

算法类函数对象

语法

template < class T > T plus < T > // 加法仿函数
template < class T > T minus < T > // 减法仿函数
template < class T > T multiplies < T > // 乘法仿函数
template < class T > T divides < T > // 除法仿函数
template < class T > T modulus < T > // 取模 ( 取余 ) 仿函数
template < class T > T negate < T > // 取反仿函数
注意 :6 个算数类函数对象 , 除了 negate 是一元运算 , 其他都是二元运算

示例

1, 基本使用
#include<algorithm>
void test04()
{
plus<int> pl;int num01 = pl(10,20);cout << "num01 = " << num01 << endl;int num02 = plus<int>()(1,20);cout << "num02 = " << num02 << endl;int num03 = minus<int>()(1,20);cout << "num03 = " << num03 << endl;int num04 = multiplies<int>()(1,20);cout << "num04 = " << num04 << endl;int num05 = divides<int>()(20,5);cout << "num05 = " << num05 << endl;int num06 = modulus<int>()(5,3);cout << "num06 = " << num06 << endl;int num07 = negate<int>()(10);cout << "num07 = " << num07 << endl;
}
2, 本月工资所有员工加 2000 奖金
class Staff{
friend void printStaff(Staff &s);string name;double money;
public:Staff(){}Staff(string name,double money){this->name = name;this->money = money;}
};
void printStaff(Staff &s)
{double money = plus<double>()(s.money,2000);cout << s.name << "本月工资为:" << money << endl;
}
void test05()
{vector<Staff> staffs;staffs.push_back(Staff("张三",3100));staffs.push_back(Staff("李四",3000));staffs.push_back(Staff("王五",3200));for_each(staffs.begin(),staffs.end(),printStaff);
}

关系运算类函数对象

语法

template < class T > bool equal_to < T > // 等于
template < class T > bool not_equal_to < T > // 不等于
template < class T > bool greater < T > // 大于
template < class T > bool greater_equal < T > // 大于等于
template < class T > bool less < T > // 小于
template < class T > bool less_equal < T > // 小于等
注意 :6 个关系运算类函数对象 , 每一种都是二元谓词

示例

1, 基本使用
void test06 ()
{
cout << "10 == 20 ? " << equal_to < int > ()( 10 , 20 ) << endl ;
cout << "20 == 20 ? " << equal_to < int > ()( 20 , 20 ) << endl ;
cout << "10 != 20 ? " << not_equal_to < int > ()( 10 , 20 ) << endl ;
cout << "10 > 20 ? " << greater < int > ()( 10 , 20 ) << endl ;
cout << "10 >= 20 ? " << greater_equal < int > ()( 10 , 20 ) << endl ;
cout << "10 < 20 ? " << less < int > ()( 10 , 20 ) << endl ;
cout << "10 <= 20 ? " << less_equal < int > ()( 10 , 20 ) << endl ;
}
2, 排序
void print ( int v )
{
cout << v << " " ;
}
void test07 ()
{
vector < int > nums ;
nums . push_back ( 14 );
nums . push_back ( 5 );
nums . push_back ( 7 );
nums . push_back ( 3 );
nums . push_back ( 9 );
for_each ( nums . begin (), nums . end (), print );
cout << endl ;
sort ( nums . begin (), nums . end (), greater < int > ());
for_each ( nums . begin (), nums . end (), print );
cout << endl ;
}

逻辑运算类函数对象

 语法
template < class T > bool logical_and < T > // 逻辑与
template < class T > bool logical_or < T > // 逻辑或
template < class T > bool logical_not < T > // 逻辑非
注意 :3 个逻辑运算类运算函数 ,not 为一元谓词,其余为二元谓词。

适配器

bind2nd 将绑定的数据放置第二个参数位置
bind1st 将绑定的数据放置第一个参数位置

函数对象适配器

特点

        将函数对象作为适配器

步骤

1, 创建一个类 , 使其公共继承 binary_function, 并进行参数萃取
参数萃取 :
        模板中第一个类型为重载函数调用运算符第一个参数的数据类型
        模板中第二个类型为重载函数调用运算符第二个参数的数据类型
        模板中第二个类型为重载函数调用运算符返回值的数据类型
2,const 修饰重载函数调用运算符
3, 使用 bindxxx 绑定函数对象与适配器

示例

1, 本月工资所有员工加 2000 奖金
class Staff{
string name;
double money;
public:Staff(){}Staff(string name,double money){this->name = name;this->money = money;}double getMoney(){return money;}
};
class PlusMoney:public binary_function<Staff,double,void>{
public:void operator()(Staff s,double d) const{double money = s.getMoney() + d;cout << money << " ";}
};
void test08()
{vector<Staff> staffs;staffs.push_back(Staff("张三",3100));staffs.push_back(Staff("李四",3000));staffs.push_back(Staff("王五",3200));for_each(staffs.begin(),staffs.end(),bind2nd(PlusMoney(),2000.0));
}

函数指针适配器

特点

将普通函数地址作为适配器
ptr_fun( 函数名 )

示例

void myPrintInt2(int val,int tmp)
{cout<<val<<" "<<tmp<<endl;
}
void test09()
{vector<int> v1;v1.push_back(30);v1.push_back(20);v1.push_back(10);v1.push_back(40);v1.push_back(50);//1、bind2nd或bind1st 进行参数绑定for_each(v1.begin(),v1.end(), bind1st(ptr_fun(myPrintInt2),300) );cout<<endl;
}

成员函数适配器

特点

将成员函数地址作为适配器
mem_fun_ref(& 类名 :: 函数名 )

示例

class Data
{
private:int a;
public:Data(){}Data(int a):a(a){}void showData(){cout<<this->a<<endl;}
};
void test10()
{vector<Data> v1;v1.push_back(Data(10));v1.push_back(Data(20));v1.push_back(Data(30));v1.push_back(Data(40));v1.push_back(Data(50));for_each(v1.begin(), v1.end(), mem_fun_ref(&Data::showData));
}

取反适配器

not1 一元函数对象取反
not2 二元函数对象取反

示例

void test11()
{vector<int> v1;v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);v1.push_back(50);vector<int>::iterator ret;ret = find_if(v1.begin(), v1.end(), not1(bind2nd(greater<int>(), 30))
);
if(ret != v1.end())
{cout<<"找到的结果:"<<*ret<<endl;
}
//lambda表达式
for_each(v1.begin(), v1.end(), [](int val){cout<<val<<" ";
} );cout<<endl;sort(v1.begin(), v1.end(),not2(greater<int>()) );for_each(v1.begin(), v1.end(), [](int val){cout<<val<<" ";
});cout<<endl;
}

算法

1.遍历

for_each
作用 : 遍历
语法
/*
遍历算法 遍历容器元素
@param beg 开始迭代器
@param end 结束迭代器
@param _callback 函数回调或者函数对象
@return 函数对象
*/
for_each ( iterator beg , iterator end , _callback );
示例1.普通使用
void print01(int v)
{cout << v << endl;
}
void test01()
{vector<int> nums;nums.push_back(10);nums.push_back(30);nums.push_back(40);nums.push_back(20);nums.push_back(50);for_each(nums.begin(),nums.end(),print01);
}
示例 2:for-each 的返回值
class Data{
public:int count;Data(){count = 0;}void operator()(int v){cout << v << " ";count++;}
};
void test02()
{list<int> nums;nums.push_back(1);nums.push_back(5);nums.push_back(2);nums.push_back(4);nums.push_back(3);cout << "数据:";Data d = for_each(nums.begin(),nums.end(),Data());cout << endl;cout << "count:" << d.count << endl;
}
示例 3
class Person{
private:string name;int age;
public:Person(){}Person(string name,int age):name(name),age(age){}~Person(){}void showInfo(){cout << name << " " << age << endl;}
};
void test03()
{vector<Person> ps;Person p1("张三",23);Person p2("李四",29);Person p3("王五",19);ps.push_back(p1);ps.push_back(p2);ps.push_back(p3);for_each(ps.begin(),ps.end(),mem_fun_ref(&Person::showInfo));
}
transform
作用:搬运
语法
/*
transform 算法 将指定容器区间元素搬运到另一容器中
注意 :transform 不会给目标容器分配内存,所以需要我们提前分配好内存
@param beg1 源容器开始迭代器
@param end1 源容器结束迭代器
@param beg2 目标容器开始迭代器
@param _cakkback 回调函数或者函数对象
@return 返回目标容器迭代器
*/
transform(iterator beg1, iterator end1, iterator beg2, _callbakc);
/*
transform 算法 将指定容器区间元素搬运到另一容器中
注意 :transform 不会给目标容器分配内存,所以需要我们提前分配好内存
@param beg1 源容器 1 开始迭代器
@param end1 源容器 1 结束迭代器
@param beg2 源容器 2 开始迭代器
@param result 结果
@param _cakkback 回调函数或者函数对象
@return 返回目标容器迭代器
*/
transform(iterator beg1, iterator end1, iterator beg2,iterator result,_callbakc);
示例 1
int setData(int a){
return a+100;
}int setData2(int a,int x){return a+x;
}
void test04()
{vector<int> vs;srand(time(NULL));for(int i = 0; i < 10; i++){vs.push_back(rand() % 100);
}
for_each(vs.begin(),vs.end(),print01);cout << endl;list<int> ls;ls.resize(vs.size());transform(vs.begin(),vs.end(),ls.begin(),setData);for_each(ls.begin(),ls.end(),print01);cout << endl;list<int> ls2;ls2.resize(vs.size());transform(vs.begin(),vs.end(),ls2.begin(),bind2nd(ptr_fun(setData2),10));for_each(ls2.begin(),ls2.end(),print01);cout << endl;
}
示例 2: 将容器 1 和容器 2 中的元素相加放入到第三个容器中
class Add{
public:
int operator()(int a,int b)
{
return a + b;
}
};
void test05()
{
vector<int> vs01;
srand(time(NULL));
for(int i = 0; i < 10; i++)
{
vs01.push_back(rand() % 100);
}
for_each(vs01.begin(),vs01.end(),print01);
cout << endl;
vector<int> vs02;
for(int i = 0; i < 10; i++)
{
vs02.push_back(rand() % 100);
}
for_each(vs02.begin(),vs02.end(),print01);
cout << endl;
vector<int> vs03;
vs03.resize(vs01.size());
transform(vs01.begin(),vs01.end(),vs02.begin(),vs03.begin(),Add());
for_each(vs03.begin(),vs03.end(),print01);
cout << endl;
}

2.查找算法

find
作用 : 寻找
语法:
/*
find 算法 查找元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return 返回查找到元素对应的迭代器
*/
find(iterator beg, iterator end, value)
示例
void test01()
{
vector<int> vs;
vs.push_back(12);
vs.push_back(15);
vs.push_back(11);
vs.push_back(13);
vs.push_back(14);
vector<int>::iterator it = find(vs.begin(),vs.end(),13);
if(it != vs.end())
{
cout << "找到了" << endl;
}
else{
cout << "不存在" << endl;
}
}
find_if
作用 : 条件查找
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param callback 回调函数或者谓词 ( 返回 bool 类型的函数对象 )
@return 返回查找到元素对应的迭代器
*/
find_if(iterator beg, iterator end, _callback)
示例:
bool myIf(int x)
{
return x > 13;
}
void test02()
{
vector<int> vs;
vs.push_back(12);
vs.push_back(15);
vs.push_back(11);
vs.push_back(13);
vs.push_back(14);
vector<int>::iterator it = find_if(vs.begin(),vs.end(),myIf);
cout << *it << endl;
}
adjacent_find
作用 : 查找相邻重复元素
语法
/**
*adjacent_find 算法 查找相邻重复元素
*@param beg 容器开始迭代器
*@param end 容器结束迭代器
*@param _callback 回调函数或者谓词 ( 返回 bool 类型的函数对象 )
*@return 返回相邻元素的第一个位置的迭代器
**/
adjacent_find(iterator beg, iterator end, _callback);
10 20 30 30 40
示例:
void test03()
{
vector<int> vs;
vs.push_back(12);
vs.push_back(15);
vs.push_back(11);
vs.push_back(11);
vs.push_back(13);
vector<int>::iterator it = adjacent_find(vs.begin(),vs.end());
cout << *it << endl;
}
binary_search
作用 : 二分查找
语法
/*
注意: 在无序序列中不可用
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return bool 查找返回 true 否则 false
*/
bool binary_search(iterator beg, iterator end, value);

示例:
 

void test04()
{
vector<int> vs;
vs.push_back(1);
vs.push_back(3);
vs.push_back(5);
vs.push_back(7);
vs.push_back(9);
bool b = binary_search(vs.begin(),vs.end(),7);
if(b){
cout << "存在" << endl;
}else{
cout << "不存在" << endl;
}
}
count
作用 : 统计
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 回调函数或者谓词 ( 返回 bool 类型的函数对象 )
@return int 返回元素个数
*/
count(iterator beg, iterator end, value);
示例
#include <set>
void test05()
{
multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(2);
s.insert(3);
s.insert(5);
int num = count(s.begin(),s.end(),2);
cout << num << endl;
}
count_if
作用 : 条件统计
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param callback 回调函数或者谓词 ( 返回 bool 类型的函数对象 )
@return int 返回元素个数
*/
count_if(iterator beg, iterator end, _callback)
示例:
void test06()
{
multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(2);
s.insert(3);
s.insert(5);
//统计容器中大于2的数
int num = count_if(s.begin(),s.end(),bind2nd(greater<int>(),2));
cout << num << endl;
//统计容器中小于2的数
int num02 = count_if(s.begin(),s.end(),bind2nd(less<int>(),2));
cout << num02 << endl;
}

3.排序算法

merge
作用 : 合并
语法
/*
注意 : 两个容器必须是有序的
@param beg1 容器 1 开始迭代器
@param end1 容器 1 结束迭代器
@param beg2 容器 2 开始迭代器
@param end2 容器 2 结束迭代器
@param dest 目标容器开始迭代器
*/
merge(iterator beg1, iterator end1, iterator beg2, iterator end2,
iterator dest)
示例:
void test01()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
vector<int> v3;
v3.resize(v1.size() + v2.size());
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
for_each(v3.begin(),v3.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

sort

作用 : 排序
语法
/*
@param beg 容器 1 开始迭代器
@param end 容器 1 结束迭代器
@param _callback 回调函数或者谓词 ( 返回 bool 类型的函数对象 )
*/
sort(iterator beg, iterator end, _callback)
示例:
void test02()
{
vector<int> vs;
vs.push_back(10);
vs.push_back(13);
vs.push_back(9);
vs.push_back(4);
vs.push_back(18);
for_each(vs.begin(),vs.end(),[](int x){
cout << x << " ";
});
cout << endl;
//默认从小到大
sort(vs.begin(),vs.end());
for_each(vs.begin(),vs.end(),[](int x){
cout << x << " ";
});
cout << endl;
sort(vs.begin(),vs.end(),[](int x,int y){
return x > y;
});
for_each(vs.begin(),vs.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

示例2:

class Person{
private:
string name;
int age;
public:
Person(){}
Person(string name,int age):name(name),age(age){}
~Person(){}
void showInfo(){
cout << name << " " << age << endl;
}
bool pSort(Person &p){
return this -> age < p.age;
}
};
void test03()
{
vector<Person> ps;
Person p1("张三",23);
Person p2("李四",29);
Person p3("王五",19);
ps.push_back(p1);
ps.push_back(p2);
ps.push_back(p3);
sort(ps.begin(),ps.end(),mem_fun_ref(&Person::pSort));
for_each(ps.begin(),ps.end(),mem_fun_ref(&Person::showInfo));
}
random_shuffle
作用 : 打乱
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
*/
random_shuffle(iterator beg, iterator end)
示例:
void test04()
{
vector<int> vs;
vs.push_back(1);
vs.push_back(2);
vs.push_back(3);
vs.push_back(4);
vs.push_back(5);
random_shuffle(vs.begin(), vs.end());
for_each(vs.begin(),vs.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

reverse

作用 : 翻转
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
*/
reverse(iterator beg, iterator end)
示例:
void test05()
{
vector<int> vs;
vs.push_back(31);
vs.push_back(2);
vs.push_back(23);
vs.push_back(14);
vs.push_back(5);
sort(vs.begin(),vs.end());
for_each(vs.begin(),vs.end(),[](int x){
cout << x << " ";
});
cout << endl;
reverse(vs.begin(),vs.end());
for_each(vs.begin(),vs.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

4.拷贝与替换

copy
作用 : 拷贝
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param dest 目标起始迭代器
*/
copy(iterator beg, iterator end, iterator dest)
示例:
void test01()
{
vector<int> vs;
vs.push_back(31);
vs.push_back(2);
vs.push_back(23);
vs.push_back(14);
vs.push_back(5);
vector<int> newVs;
newVs.resize(vs.size());
copy(vs.begin(),vs.end(),newVs.begin());
for_each(newVs.begin(),newVs.end(),[](int x){
cout << x << endl;
});
}
replace
作用 : 替换
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param oldvalue 旧元素
@param oldvalue 新元素
*/
replace(iterator beg, iterator end, oldvalue, newvalue)
示例:
void test02()
{
vector<int> vs;
vs.push_back(31);
vs.push_back(2);
vs.push_back(23);
vs.push_back(14);
vs.push_back(5);
replace(vs.begin(),vs.end(),2,20);
for_each(vs.begin(),vs.end(),[](int x){
cout << x << endl;
});
}
replace_if
作用 : 条件替换
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param callback 函数回调或者谓词 ( 返回 Bool 类型的函数对象 )
@param oldvalue 新元素
*/
replace_if(iterator beg, iterator end, _callback, newvalue)
示例:
void test03()
{
vector<int> vs;
vs.push_back(31);
vs.push_back(2);
vs.push_back(23);
vs.push_back(14);
vs.push_back(5);
replace_if(vs.begin(),vs.end(),[](int x){
return x < 20;
},20);
for_each(vs.begin(),vs.end(),[](int x){
cout << x << endl;
});
}
swap
作用 : 交换
语法
/*
@param c1 容器 1
@param c2 容器 2
*/
swap(container c1, container c2)
示例:
void test04()
{
vector<int> v01;
v01.push_back(1);
v01.push_back(2);
v01.push_back(3);
v01.push_back(4);
v01.push_back(5);
vector<int> v02;
v02.push_back(6);
v02.push_back(7);
v02.push_back(8);
cout << "交换前:" << endl;
for_each(v01.begin(),v01.end(),[](int x){
cout << x << " ";
});
cout << endl;
for_each(v02.begin(),v02.end(),[](int x){
cout << x << " ";
});
cout << endl;
swap(v01,v02);
cout << "交换后:" << endl;
for_each(v01.begin(),v01.end(),[](int x){
cout << x << " ";
});
cout << endl;
for_each(v02.begin(),v02.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

5.常用算数生成算法

accumulate
作用 : 计算容器元素累计总和
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 累加值
@return int 总和
*/
accumulate(iterator beg, iterator end, value)
示例:
void test01()
{
vector<int> v01;
v01.push_back(1);
v01.push_back(2);
v01.push_back(3);
v01.push_back(4);
v01.push_back(5);
int sum = 0;
sum = accumulate(v01.begin(),v01.end(),0);
cout << sum << endl;
}
fill
作用 : 指定的值赋给指定范围内的所有元素
语法
/*
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value t 填充元素
*/
fill(iterator beg, iterator end, value)
示例:
void test02()
{
vector<int> v01;
v01.push_back(1);
v01.push_back(2);
v01.push_back(3);
v01.push_back(4);
v01.push_back(5);
fill(v01.begin(),v01.end(),10);
for_each(v01.begin(),v01.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

set_intersection

作用 : 获取交集
语法
/*
注意 : 两个集合必须是有序序列
@param beg1 容器 1 开始迭代器
@param end1 容器 1 结束迭代器
@param beg2 容器 2 开始迭代器
@param end2 容器 2 结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
*/
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator
end2, iterator dest)
示例:
void test03()
{
vector<int> v01;
v01.push_back(1);
v01.push_back(2);
v01.push_back(3);
v01.push_back(4);
v01.push_back(5);
vector<int> v02;
v02.push_back(1);
v02.push_back(4);
v02.push_back(7);
vector<int> v03;
//back_inserter:获取一个插入迭代器
set_intersection(v01.begin(),v01.end(),v02.begin(),v02.end(),back_inse
rter(v03));
for_each(v03.begin(),v03.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

set_union

作用 : 获取并集
语法
/*
注意 : 两个集合必须是有序序列
@param beg1 容器 1 开始迭代器
@param end1 容器 1 结束迭代器
@param beg2 容器 2 开始迭代器
@param end2 容器 2 结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
*/
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2,
iterator dest)
示例:
void test04()
{
vector<int> v01;
v01.push_back(1);
v01.push_back(2);
v01.push_back(3);
v01.push_back(4);
v01.push_back(5);
vector<int> v02;
v02.push_back(1);
v02.push_back(4);
v02.push_back(7);
vector<int> v03;
//back_inserter:获取一个插入迭代器
set_union(v01.begin(),v01.end(),v02.begin(),v02.end(),back_inserter(v0
3));
for_each(v03.begin(),v03.end(),[](int x){
cout << x << " ";
});
cout << endl;
}

set_difference

作用 : 取差集
差集 :A B 的差集 , 就是 A 中有 B 中没有的元素集合 , 反之 B A 取差集 , 就是 B 中有 A 中没有的元
素集合
如:
        A中元素 :1,3,5,7,9
        B中元素 :,7,9,11,13
        A与 B 的差集就是 :1,3,5
        B与 A 的差集就是 :11,13
语法
/*
注意 : 两个集合必须是有序序列
@param beg1 容器 1 开始迭代器
@param end1 容器 1 结束迭代器
@param beg2 容器 2 开始迭代器
@param end2 容器 2 结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
*/
set_difference(iterator beg1, iterator end1, iterator beg2, iterator
end2, iterator dest)
示例:
void test05()
{
vector<int> v01;
v01.push_back(1);
v01.push_back(3);
v01.push_back(5);
v01.push_back(7);
v01.push_back(9);
vector<int> v02;
v02.push_back(9);
v02.push_back(11);
v02.push_back(13);
vector<int> v03;
//back_inserter:获取一个插入迭代器
set_difference(v01.begin(),v01.end(),v02.begin(),v02.end(),back_insert
er(v03));
for_each(v03.begin(),v03.end(),[](int x){cout << x << " ";
});
cout << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库入门到大牛_基础_16_变量、流程控制与游标

文章目录 1. 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量 1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 对比会话用户变量与局部变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构…

四川劳动保障杂志社四川劳动保障编辑部四川劳动保障杂志2023年第10期目录

主题报道 四川抢抓“金九银十”招聘季多措并举稳就业促就业 举措频“上新” 金秋送岗忙 张玉芳; 2-5 法眼《四川劳动保障》投稿&#xff1a;cnqikantg126.com 筑牢长期护理保险基金安全防线 李科仲;赖晓薇; 6-7 调研 提升职业技能培训工作的举措 寇爵; 8-9 城乡…

实战中使用的策略模式,使用@ConditionalOnProperty实现根据环境注册不同的bean

场景复现 举个例子&#xff0c;针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略&#xff0c;比如&#xff0c;在内存比较大的设备&#xff0c;可以一次性加载&#xff0c;繁殖需要使用懒加载&#xff0c;这个时候我们就可以采用配置文件配置中心去控制了 Cond…

四川开启智能巡河形式,无人机水利行业应用再创新

在四川省某区域&#xff0c;复亚智能无人机系统以其独特的机场网格化部署得到成功应用&#xff0c;覆盖了该区域内多条市级、省级河流&#xff0c;成为水利行业的新亮点。这一先进系统以无人机水利行业应用为核心&#xff0c;通过网格化和信息化手段&#xff0c;实现了对水域环…

城市内涝积水监测系统,全方位监测城市内涝

在城市规划与防灾减灾的领域中&#xff0c;城市内涝积水监测系统的构建至关重要。随着城市化进程的加快&#xff0c;城市内涝问题日益凸显&#xff0c;对市民的生活质量和生命财产安全构成威胁。为了应对这一问题&#xff0c;建设一套高效、精准的城市内涝积水监测系统势在必行…

LeetCode Hot100 155.最小栈

题目&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获…

PTA:猜帽子游戏 ,C语言

题目 宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如…

鸿蒙开发ArkUI -常用布局

线性布局(Row/Column) 间距/主轴排列方式/交叉轴对齐方式 Column({}) {Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3)Column() {}.width(80%).height(50).backgroundColor(0xD2B48C)Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3) } .width(1…

组装自己的稳定扩散模型

在本文中&#xff0c;我们将利用 Hugging Face Diffusers 库的组件实现自己的稳定扩散模型&#xff0c;可以像 diffuser.diffuse() 一样简单地生成图像。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编…

三、【合成中的构图】

文章目录 在海报合成中&#xff0c;也会采用构图的思想来进行布局&#xff0c;像我们拍照摄影的时候&#xff0c;也会采用左右构图&#xff0c;居中构图&#xff0c;三点构图&#xff0c;对称构图&#xff0c;通过这些构图方式&#xff0c;合理的让各种素材结合在一起&#xff…

做外贸想赚客户的钱,先想想自己比别人强在哪

Nicky说她用搜到的客户邮箱信息&#xff0c;给客户发开发信&#xff0c;基本上是发一通都像石沉大海一样&#xff0c;没有激起任何水花。从软件中来的客户信息&#xff0c;有电话或者WhatsApp的&#xff0c;添加上了&#xff0c;有的客户会直接忽略&#xff0c;有的会问从哪里拿…

VC++、MFC中操作excel时,Rang和Rangs的区别是什么?

Rang 参考微软说明 作用 表示一个单元格、一行、一列、一个包含单个或若干连续单元格区域的选定单元格范围&#xff0c;或者一个三维区域。 说明 Range 的默认成员将不包含参数的调用转发至 Value 属性 如&#xff0c;someRange someOtherRange 等效于 someRange.Value …

C中指针的定义、表示法、类型和算术

0. 指针到底是什么&#xff1f; 在我们讨论指针的定义之前&#xff0c;让我们先了解一下当我们编写时会发生什么 int digit 42; 编译器保留一块内存来保存int值。该块的名称为digit&#xff0c;该块中存储的值为42。现在&#xff0c;为了记住该块&#xff0c;它被分配了一个地…

Mysql的二阶段提交

先看执行器与InnoDB引擎是如何更新一条指定的数据的 可以看到&#xff0c;InnoDB在写redo log时&#xff0c;并不是一次性写完的&#xff0c;而有两个阶段&#xff0c;Prepare与Commit阶段&#xff0c;这就是"两阶段提交"的含义。 为什么要写redo log&#xff0c;不…

echarts实际开发中遇到的问题

当tooltip内容过高时&#xff0c;增加滚动条 enterable:true, extraCssText: height:500px;overflow-y:auto;

https到底把什么加密了?

首先直接说结论&#xff0c; https安全通信模式&#xff0c;是使用TLS加密传输所有的http协议。再重复一遍&#xff0c;是所有&#xff01; 通常将TLS加密传输http这个通信过程称为https&#xff0c;如果使用协议封装的逻辑结构来表达就是&#xff1a; IP TCP TLS 【 HTTP 】…

(C++)string类的模拟实现

愿所有美好如期而遇 前言 我们模拟实现string类不是为了去实现他&#xff0c;而是为了了解他内部成员函数的一些运行原理和时间复杂度&#xff0c;在将来我们使用时能够合理地去使用他们。 为了避免我们模拟实现的string类与全局上的string类冲突(string类也在std命名空间中)&…

羊大师介绍,备孕阶段饮食规划及对羊奶的影响

备孕期是夫妻俩为了生育健康宝宝所准备的重要阶段&#xff0c;在这个阶段&#xff0c;营养的摄入对于双方的身体健康和胚胎的发育至关重要。而羊奶作为一种营养丰富的饮品&#xff0c;备孕期间是否能喝羊奶一直是备孕夫妇们关注的话题。本文小编羊大师将会详细解答这一问题&…

AIGC系列之:升级版的Stable Diffusion之SDXL介绍

目录 AIGC工具对比 DALL-E MidJourney Stable Diffusion 相关资料 SDXL介绍 SDXL生图效果 SDXL训练LoRA流程 AIGC工具对比 在目前的三大新兴文本转图像模型中&#xff0c;Stable Diffusion诞生得最晚&#xff0c;但由于拥有发展良好的开源社区&#xff0c;它的用户关注…

7 最大的以1为边界的正方形

来源&#xff1a;LeetCode第1139题 难度:中等 描述&#xff1a;给你一个由若干0和1组成的二维网格grid&#xff0c;请你找出边界全部由1组成的最大正方形子网格&#xff0c;并返回该子网格中的元素个数&#xff0c;若不存在&#xff0c;则返回0&#xff1b; 思路&#xff1a…