c++笔记 STL标准模板库 算法2

c++笔记 STL标准模板库 算法2,第1张


一、常用的遍历算法

1.for_each:遍历容器元素

2. transform算法 将指定容器区间元素搬运到另一容器中

 

 

int myTransway(int val)
{
	return val;
}
class MyTransInt
{
public:
	int operator()(int val)
	{
		return val;
	}
};
void test()
{
	vector v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	//将v1容器的元素 帮运到 v2中
	vector v2;
	//预先:设置v2的大小(注意!!!)
	v2.resize(v1.size());
	//transform(v1.begin(), v1.end(), v2.begin(),myTransway );
	transform(v1.begin(), v1.end(), v2.begin(), MyTransInt());

	for_each(v2.begin(), v2.end(), [](int val) {cout << val << " "; });
}
 

二、常用的查找算法 1. find算法 查找元素

 失败返回v.end(),注意v.end()并不是最后一个元素,而是最后一个元素之后的节点。


class Person
{
public:
	string name;
	int age;
public:
	Person(string name, int age)
		{
		   this-> name = name;
		   this-> age = age;
		}
	bool operator==(const Person &ob)
		{
		if (this-> name == ob.name && this-> age == ob.age)
			return true;
		return false;
		}
};
void test01()
{

		vector v1;
		v1.push_back(10);
		v1.push_back(20);
		v1.push_back(30);
		v1.push_back(40);
		
		vector::iterator ret;
		ret = find(v1.begin(), v1.end(), 20);
		if (ret != v1.end())
		{
			cout << "找到的数据为:" << *ret << endl;
		}
	
		 vector v2;
		 v2.push_back(Person("德玛西亚", 18));
		 v2.push_back(Person("小法", 19));
		 v2.push_back(Person("小炮", 20));
		 v2.push_back(Person("牛头", 21));
		
		 Person tmp("小炮", 20);
		 vector::iterator ret2;
		//对于find寻找自定义数据 需要重载==
		 ret2 = find(v2.begin(), v2.end(), tmp);
		 if (ret2 != v2.end())
		 {
			 cout << "找到的数据name=" << (*ret2).name << ",age=" << (*ret2).age << endl;
		  }
}
2、find_if条件查找

 

bool myGreaterThan20(int val)
{
    return val > 20;
}
class MyGreaterThan20 {
public:
	 bool operator()(int val)
	   {
		return val > 20;
	   }
};
void test02()
{
	vector v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	//寻找第一个大于20的数
	vector::iterator ret;
	//ret = find_if(v1.begin(),v1.end(), myGreaterThan20 );
	ret = find_if(v1.begin(), v1.end(), MyGreaterThan20());
	if (ret != v1.end())
	{
		cout << "寻找到的数据为:" << *ret << endl;
	}
}
 3.binary_search算法 二分查找法(容器必须有序)

void test03()
{
	
	vector v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
		
	bool ret = binary_search(v1.begin(), v1.end(), 30);
	if (ret == true)
		{
		cout << "找到" << endl;
		}
	else
		{
		cout << "未找到" << endl;
	}
}
4.count算法 统计元素出现次数

 

void test04()
{
	
	vector v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(10);
	v1.push_back(40);
	v1.push_back(10);
		
	cout << count(v1.begin(), v1.end(), 10) << endl;//3
}
 5、count_if算法 统计元素出现次数

 

void test05()
{

	vector v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(10);
	v1.push_back(40);
	v1.push_back(10);
		
	cout << count(v1.begin(), v1.end(), 10) << endl;//3
		
	//普通函数
	cout << count_if(v1.begin(), v1.end(), myGreaterThan10) << endl;//2
	//函数对象
	cout << count_if(v1.begin(), v1.end(), MyGreaterThan10()) << endl;//2
	//内建函数对象
	cout << count_if(v1.begin(), v1.end(), bind2nd(greater(), 10))
	<< endl;//2
}

三、常用排序算法 1、merge算法 容器元素合并,并存储到另一容器中(每个容器必须有序)

 2、sort算法 容器元素排序

 3.random_shuffle算法 对指定范围内的元素随机调整次序

 

#include
void test07()
{

	vector v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);	
	//srand设置种子
	srand(time(NULL));	
	for_each(v1.begin(), v1.end(), [](int val) {cout << val << " "; });
	cout << endl;
	
	//需要配置 srand
	random_shuffle(v1.begin(), v1.end());
		
	for_each(v1.begin(), v1.end(), [](int val) {cout << val << " "; });
	cout << endl;
	
}
 4、reverse算法 反转指定范围的元素

 

四、常用拷贝和替换算法 1、copy算法 将容器内指定范围的元素拷贝到另一容器中

 2、replace算法 将容器内指定范围的旧元素修改为新元素

 3、replace_if算法 将容器内指定范围满足条件的元素替换为新元素

 

void test09()
{

	vector v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);
	
	//将容器中的3替换成3000
	replace(v1.begin(), v1.end(), 3, 3000);
	copy(v1.begin(), v1.end(), ostream_iterator(cout, " "));
	cout << endl;
		
	vector v2;
	v2.push_back(1);
	v2.push_back(3);
	v2.push_back(5);
	v2.push_back(7);
	//将容器的大于3替换成3000
	replace_if(v2.begin(), v2.end(), bind2nd(greater(), 3), 1000);
	copy(v2.begin(), v2.end(), ostream_iterator(cout, " "));
	cout << endl;
}

replace_if(v2.begin(),v2.end(), bind2nd(greater(),3) , 1000 );

将大于3的数字替换为1000

4.swap算法 互换两个容器的元素

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/577741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存