0
点赞
收藏
分享

微信扫一扫

ChatGPT出来后,为什么老有人想让我们程序员失业?

90哦吼 2023-06-01 阅读 97

1)map容器的4种初始化方式及常用操作: 插入,查找,删除;
map<int,string> a;
a.insert(map<int,string>::value_type(1,“one”)); //value_type
a.insert(make_pair<int,string>(2,“two”)); //make_pair;
a.insert(pair<int,string>(3,“three”)); //pair
a[4] = “four”; //按数组方式初始化
//cout<first()<<" “<second()<<endl; 这样书写是错误的,没有括号;
void printfMsg(std::map<int,string>& arg)
{
auto iter = arg.begin();
for(;iter != arg.end(); ++iter)
{
cout<first<<” "<second<<endl;
}
}

int main(int argc, char *argv[])
{
map<int,string> a;
a.insert(map<int,string>::value_type(1,“one”)); //value_type
a.insert(make_pair<int,string>(2,“two”)); //make_pair;
a.insert(pair<int,string>(3,“three”)); //pair
a[4] = “four”; //按数组方式初始化
printfMsg(a);
auto iter = a.find(2); //find的返回的是一个迭代器
if(iter != a.end() ) //找到了
{
a.erase(2); //删除key为2的键值对
}
printfMsg(a);
return 0;
}
2)set的使用方法:
void printfMsg(std::set& arg)
{
auto iter = arg.begin();
for(;iter != arg.end(); ++iter)
{
cout<<*iter<<’ ';
}
cout<<endl;
}

int main(void)
{
std::set a;
a.insert(33);
a.insert(-9);
a.insert(6);
a.insert(22);
printfMsg(a);
return 0;
}
//输出结果:-9 6 22 33
//stl算法
函数对象:函数对象使用class做出来的,用起来像一个函数;
很多算法,需要传一个函数对象;
预定义的函数对象:

函数对象和算法结合使用;
#include
#include
#include
#include
#include

using namespace std;
void printfMsg(std::set<int,greater> arg)
{
auto iter = arg.begin();
for(;iter != arg.end(); ++iter)
{
cout<<*iter<<’ ';
}
cout<<endl;
}

int main(void)
{
set<int,greater> a; //完整的定义是这样的 set<int,less> b;
a.insert(9);
a.insert(-3);
a.insert(8);
a.insert(1);
a.insert(6);
printfMsg(a);
return 0;
}

// for_each(a.begin(),a.end(),函数或函数对象);
for_each(a.begin(),a.end(),printfMsg); //这样写:printfMsg(a)是错误的

void printfMsg(int arg)
{
cout<<arg<<’ ';
}

class printClassMsg
{
public:
void operator()(int element) const
{
cout<<element<<’ ';
}
};

int main(void)
{
vectora{3,4,2,6,7,9};
// for_each(a.begin(),a.end(),函数或函数对象);
for_each(a.begin(),a.end(),printfMsg); //这样写:printfMsg(a)是错误的,直接写函数名即可!!!
for_each(a.begin(),a.end(),printClassMsg()); //函数对象和普通函数在调用时,一个有括号,一个没有请注意
//printClassMsg会创建一个对象,此对象调用operator()的成员函数;
cout<<endl;
return 0;
}

2)元素计数算法

count 和count_if算法,有些成员函数已经有了,如set,map,multimap,multiset;
所有的算法都是有两个迭代器;
如果有if的,需要一个函数或者函数对象作为一个谓词;
vector a{3,5,2,4,3,1,4,0};
auto num = count(a.begin(),a.end(),4);
cout<<num<<endl;
//返回值为bool的函数,叫谓词
bool isTrue(int num)
{
return num % 2 == 0;
}
int main(void)
{
vector a{3,5,2,4,3,1,4,0};
auto num = count_if(a.begin(),a.end(),isTrue);
cout<<num<<endl;

return 0;

}

bind2nd函数适配器的用法:预定义的函数对象和函数适配器结合起来使用;
vector a{3,5,2,4,3,1,4,0}; //bind2nd传入2个参数,para1,para2,其中para2用代替;
auto num = count_if(a.begin(),a.end(),bind2nd(greater(),4)); //在a的容器中,有多少数据大于4
是一个函数对象,不能忘记小括号
cout<<num<<endl;

vector a{3,5,2,4,3,1,4,0}; //bind2nd传入2个参数,para1,para2,其中para2用代替;
auto num = count_if(a.begin(),a.end(),bind2nd(modulus(),2) ); //函数适配器把两个参数转为一个
cout<<num<<endl;

//下面的是有多少奇数,如果要找多少偶数,则继续用函数适配器
auto num = count_if(a.begin(),a.end(),not1(bind2nd(modulus(),2)) ); //函数适配器把两个参数转为一个

3)最小值和最大值算法
min_element(b,e)
min_element(b,e,二元谓词) //三个参数
max_element(b,e)

vector a{3,5,2,4,3,1,-4,0};
auto iter = min_element(a.begin(),a.end());
cout<<*iter<<endl;
cout<<*min_element(a.begin(),a.end())<<endl;
//上面两句可以合并为1句:如 cout<<*min_element(a.begin(),a.end())<<endl;
bool isAbsLess(int a,int b)
{
return abs(a) < abs(b);
}

int main(void)
{
vector a{3,5,2,4,3,1,-4,0};
cout<<*min_element(a.begin(),a.end(),isAbsLess)<<endl;
return 0;
}

4)find和find_if查找

int main(void)
{
list listMsg;

for(int i = 0; i< 9; ++i)
{
	listMsg.insert(listMsg.end(),i);
}
for(int i = 0; i< 9; ++i)
{
	listMsg.insert(listMsg.end(),i);
}	

list<int>::iterator iter1;
iter1 = find(listMsg.begin(),listMsg.end(),4);

list<int>::iterator iter2;
iter2= find(++iter1,listMsg.end(),4);
if(iter1 != listMsg.end() && iter2 != listMsg.end())
{
	for(auto iter = iter1; iter != iter2; ++iter)
	{
		cout<<*iter<<' ';
	}
}
cout<<endl;
return 0;

}

void printfMsg(list arg)
{
for(auto e : arg)
{
cout<<e<<’ ';
}
}

//能够被3整除,用函数适配器和函数对象结合使用;
auto pos = find_if(listMsg.begin(),listMsg.end(),not1(bind2nd(modulus(),3)));

vector listMsg;

for(int i = 1; i< 9; ++i)
{
listMsg.insert(listMsg.end(),i);
}

auto pos = find_if(listMsg.begin(),listMsg.end(),not1(bind2nd(modulus(),3)));
cout<<*pos<<endl;
cout<<endl;

//查找相邻数据相等,或者满足谓词的数据
adjacent_find(b,e)
adjacent_find(b,e,op);
int main(void)
{
vector a{2,3,4,2,2,65,32,78,9};
auto iter = adjacent_find(a.begin(),a.end());
if(iter != a.end())
cout<<distance(a.begin(),iter)<<endl;
cout<<*iter<<endl;
return 0;
}

bool check(int a,int b)
{
return(a * 2 == b); //满足后面的数据是前面的两倍
}
int main(void)
{
vector a{2,3,4,8,2,65,32,78,9};
auto iter = adjacent_find(a.begin(),a.end(),check);
if(iter != a.end())
cout<<distance(a.begin(),iter)<<endl;
cout<<*iter<<endl;
return 0;
}

//已序区间查找(binary_search lower_bound upper_bound equal_bound)
int main(void)
{
vector a{1,2,36,4,5};
sort(a.begin(),a.end()); //必须排序,否则不能查找
if(binary_search(a.begin(),a.end(),5))
{
cout<<"find "<<endl;
}
else
cout<<“not find”<<endl;
return 0;
}

int main(void)
{
list ilist{1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9};
ilist.push_back(5);
ilist.push_back(5);
ilist.push_back(5);

ilist.sort();
list<int>::iterator pos1;
list<int>::iterator pos2;
printfMsg(ilist);
pos1 = lower_bound(ilist.begin(),ilist.end(),5);
pos2 = upper_bound(ilist.begin(),ilist.end(),5);

if((pos2 != ilist.end()) && pos1 != ilist.end())
{
	cout<<distance(pos1,pos2)<<endl; //共计5个
}	
return 0;

}

int main(void)
{
list ilist{1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9};
ilist.push_back(5);
ilist.push_back(5);
ilist.push_back(5);

ilist.sort();
printfMsg(ilist);
std::pair<list<int>::iterator,list<int>::iterator> range;
range = equal_range(ilist.begin(),ilist.end(),5); //equal_range返回的是pair对象
cout<<distance(range.first,range.second)<<endl;
return 0;

}

//for_each遍历算法
class elementChange
{
public:
void operator()(int& e)
{
e = e + 3;
}
};

void printfMsg(list arg)
{
for(auto e : arg)
{
cout<<e<<’ ';
}
cout<<endl;
}

int main(void)
{
list ilist{1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9};
printfMsg(ilist);
for_each(ilist.begin(),ilist.end(),elementChange()); //所有数据在原基础上加3
printfMsg(ilist);
return 0;
}

(2)利用for_each的返回值做更好的设计,计算一个迭代器区间的数据平均值
class MeanValue
{
private:
int num;
int sum;
public:
MeanValue(void) : num(0),sum(0){}
void operator()(int e)
{
num++;
sum += e;
}
double meanCalc(void)
{
return( static_cast(sum) / static_cast(num));
}
};
int main(void)
{
list ilist{1,2,3,4,5,6,7,8,9};
printfMsg(ilist);
auto result = for_each(ilist.begin(),ilist.end(),MeanValue());
printf(“result is: %f\r\n”,result.meanCalc());
return 0;
}

1)区间的比较算法
equal算法
bool check(int ele1,int ele2)
{
return(ele1 % 2 == ele2 % 2);
}
int main(void)
{
vector ivec{1,2,3,4,5,6,7,8};
list ilist{3,4,5,6,7,8,9,10};
printMsg(ivec);
printMsg(ilist);

if(equal(ivec.begin(),ivec.end(),ilist.begin()))
{
	cout<<"equal"<<endl;
}
else
{
	cout<<"not equal"<<endl;
}
	
if(equal(ivec.begin(),ivec.end(),ilist.begin(),check)) //谓词的用法
{
	cout<<"equal"<<endl;
}
else
{
	cout<<"not equal"<<endl;
}
return 0;

}

//back_inserter的用法
int main(void)
{
vector ivec{3,5,3,4,5,6,7,8};
// list ilist(20); //初始化20个元素的位置
list ilist; //初始化20个元素的位置
copy(ivec.begin(),ivec.end(),back_inserter(ilist)); //back_inserter 插入型迭代器
printMsg(ilist);
return 0;
}

vector ivec{3,5,3,4,5,6,7,8}; //输出流迭代器
copy(ivec.begin(),ivec.end(),ostream_iterator (cout," ")); //拷贝到终端显示 头文件是iterator;

复制过程中删除某些元素,使用remove_copy或者remove_copy_if算法;
bool check(char& tmp)
{
return((tmp == ‘|’) || (tmp == ‘x’) || (tmp == ‘0’) );
}
int main(void) //remove_copy_if的算法使用
{
string str(“0x1||0x2||0x3||0x4”);
string str2;
cout<<str2<<endl;
remove_copy_if(str.begin(),str.end(),back_inserter(str2),check); //去除’|',‘x’, '0’等字符
cout<<str2<<endl;
return 0;
}

举报

相关推荐

0 条评论