C++之STL算法(1)

发布时间:2023年12月17日

??STL容器算法主要由、、组成;
??algorithm主要有遍历、比较、交换、查找、拷贝、修改等;

1.遍历容器for_each

??for_each()函数用于完成容器遍历,函数参数如下:

for_each(_InIt _First, _InIt _Last, _Fn _Func)
形参:_First、_Last --容器的起始和结束迭代器
     _Func -->仿函数(回调函数),处理要输出的信息

1.1 vector容器遍历

??自定义数据格式:

class Person
{
	friend class mycompare;
	friend class Myprint;//友元类
	friend void Print(const Person& p);//友元函数
public:
	Person() {}
	Person(string name, int age) :name(name), age(age) {

	}
	Person(const Person& p)
	{
		name = p.name;
		age = p.age;
	}
	bool operator<(const Person& p)const
	{
		if (this->age == p.age)
		{
			return p.name < p.name;
		}
		return this->age > p.age;
	}
private:
	string name;
	int age;
};
void Print(const Person& p)
{
	cout << "姓名:" << p.name << "\t年龄:" << p.age << endl;
}
class Myprint
{
public:
	void operator()(const Person& p)
	{
		cout << "姓名:" << p.name << "\t年龄:" << p.age << endl;
	}
	void operator()(const pair<Person, int>& p)
	{
		cout << "姓名:" << (p.first).name << "\t年龄:" << (p.first).age << "\t成绩:" << p.second << endl;
	}
};
class mycompare
{
public:
	bool operator()(const Person& p1,const Person& p2)const
	{
		if (p1.age == p2.age)
		{
			return p1.name < p2.name;
		}
		return p1.age > p2.age;
	}
};
void vector_test()
{
	cout << "\tvector容器示例:" << endl;
	//创建vector容器--->单端数组
	vector<Person>vtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小林", 18));
	vtr.push_back(Person("小李", 18));
	vtr.push_back(Person("小刘", 18));
	cout << "提供一个函数示例:" << endl;
	for_each(vtr.begin(), vtr.end(), Print);
	cout << "提供一个仿函数示例:" << endl;
	for_each(vtr.begin(), vtr.end(), Myprint());
}

1.2 list容器遍历

void list_test()
{
	//创建一个list容器-->双向链表
	cout << "\tlist容器示例:" << endl;
	list<Person> t;
	t.push_back(Person("小王", 18));//尾插
	t.push_front(Person("小林", 18));//头插
	t.push_back(Person("小李", 18));
	t.push_back(Person("小刘", 18));
	cout << "提供一个仿函数示例:" << endl;
	for_each(t.begin(), t.end(), Myprint());
}

1.3 set容器遍历

void set_test()
{
	cout << "\tset/multiset关联式容器:" << endl;
	multiset<Person>mt;//该容器会自动排序
	mt.insert(Person("小王", 18));
	mt.insert(Person("小林", 18));
	mt.insert(Person("小李", 17));
	mt.insert(Person("小刘", 18));
	mt.insert(Person("小李", 22));
	for_each(mt.begin(), mt.end(), Myprint());

	cout << "\tset/multiset关联式容器(仿函数示例):" << endl;
	multiset<Person, mycompare>mt2;
	mt2.insert(Person("小王", 18));
	mt2.insert(Person("小林", 18));
	mt2.insert(Person("小李", 17));
	mt2.insert(Person("小刘", 18));
	mt2.insert(Person("小李", 22));
	for_each(mt.begin(), mt.end(), Myprint());
}

1.4 map容器遍历

void map_test()
{
	cout << "\tmap关联式容器示例:" << endl;
	multimap<Person, int>mp;
	mp.insert(make_pair(Person("小王", 18), 88));
	mp.insert(pair<Person,int>(Person("小林", 18),99));
	mp.insert(pair<Person, int>(Person("小李", 17), 95));
	mp.insert(pair<Person, int>(Person("小刘", 18), 95));
	mp.insert(pair<Person, int>(Person("小李", 22), 90));
	for_each(mp.begin(), mp.end(), Myprint());
}

1.5 整体运行效果

int main()
{
	vector_test();//vector容器
	list_test();//list容器
	set_test();//set容器
	map_test();//map容器
	system("pause");
}

在这里插入图片描述

2.转移元素transform

transform函数:
	transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
	将一个函数中的元素拷贝到另一个容器中,
	_First、_Last --要转移的容器的起始迭代器和结束迭代器
	_Dest --目标容器的起始迭代器
	_Func --仿函数,支持一元运算,可以对当前值进行+ - *  等各种运算
  • 使用示例:
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
/*
transform函数:
	transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
	将一个函数中的元素拷贝到另一个容器中,
	_First、_Last --要转移的容器的起始迭代器和结束迭代器
	_Dest --目标容器的起始迭代器
	_Func --仿函数,支持一元运算,可以对当前值进行+ - * \ 等各种运算
*/
class myprint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
class myfunc
{
public:
	int operator()(int val1)
	{
		return val1;
	}
};

void test()
{
	vector<int>t1;
	for (int i = 0; i < 10; i++)
	{
		int temp = rand() % 101;
		t1.push_back(temp);
	}
	cout << "原容器数据:" << endl;
	for_each(t1.begin(), t1.end(), myprint());
	cout << endl;
	vector<int>target;
	target.resize(t1.size());//设置target容器大小
	transform(t1.begin(), t1.end(), target.begin(), myfunc());
	cout << "转移后的容器内容:" << endl;
	for_each(target.begin(), target.end(), myprint());
	cout << endl;
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_44453694/article/details/134938906
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。