深入探究C++中的容器适配器与仿函数技术

 更新时间:2023年04月23日 09:06:47   作者:命由己造~  
C++中的容器适配器和仿函数是实现数据结构与算法的重要技术,容器适配器可以将一个容器转换为另一个形式,仿函数则可以自定义数据类型的比较、排序、计算等行为,提高程序的灵活性和可重用性

一、容器适配器

容器适配器其实是一种设计模式。转换出我们想要的东西。

比方说我们实现栈的时候既可以用数组,也可以用链表,此时我们就可以用到容器适配器了。

namespace yyh
{
	template <class T, class container = vector<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top()
		{
			return _con.back();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		container _con;
	};
}
int main()
{
	yyh::stack<int, vector<int>> st1;
	yyh::stack<int, list<int>> st2;
	return 0;
}

这样我们就可以用不同的底层实现栈了。

二、仿函数

仿函数其实就是用类重载()的方式来模拟一个函数。

我们现在写一个比较大小的仿函数

namespace yyh
{
	template <class T>
	struct less
	{
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};
	template <class T>
	struct greater
	{
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}
	};
}

这个类我们就可以成为仿函数,而该类的对象成为函数对象。

用法:

当我们想同时派升序和降序的时候,我们可以利用仿函数来进行比较。

namespace yyh
{
	template <class T>
	struct less
	{
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};
	template <class T>
	struct greater
	{
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}
	};
	template <class T, class compare>
	void BubbleSort(vector<T>& a, compare com)
	{
		for (int i = 0; i < a.size() - 1; i++)
		{
			//用来判断是否交换过,提高效率
			int flag = 1;
			for (int cur = 0; cur < a.size() - 1 - i; cur++)
			{
				if (com(a[cur + 1], a[cur]))
				{
					swap(a[cur], a[cur + 1]);
					flag = 0;
				}
			}
			if (flag)
			{
				break;
			}
		}
	}
}
int main()
{
	yyh::less<int> lessFun;
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(2);
	v1.push_back(4);
	v1.push_back(3);
	yyh::BubbleSort(v1, lessFun);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	return 0;
}

到此这篇关于深入探究C++中的容器适配器与仿函数技术的文章就介绍到这了,更多相关C++容器适配器与仿函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++设计模式之简单工厂模式实例

    C++设计模式之简单工厂模式实例

    这篇文章主要介绍了C++设计模式之简单工厂模式实例,工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品,需要的朋友可以参考下
    2014-09-09
  • 浅谈返回函数内部new分配的内存的引用

    浅谈返回函数内部new分配的内存的引用

    下面小编就为大家带来一篇浅谈返回函数内部new分配的内存的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++ lambda 捕获模式与右值引用的使用

    C++ lambda 捕获模式与右值引用的使用

    这篇文章主要介绍了C++ lambda 捕获模式与右值引用的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++计算ICMP头的校验和实例

    C++计算ICMP头的校验和实例

    这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
    2014-10-10
  • C++中产生临时对象的情况及其解决方案

    C++中产生临时对象的情况及其解决方案

    这篇文章主要介绍了C++中产生临时对象的情况及其解决方案,以值传递的方式给函数传参,类型转换以及函数需要返回对象时,并给对应给出了详细的解决方案,通过图文结合的方式讲解的非常详细,需要的朋友可以参考下
    2024-05-05
  • Qt实现文本编辑器(二)

    Qt实现文本编辑器(二)

    这篇文章主要介绍了利用Qt实现的一个文本编辑器。本文将具体讲解下是如何实现菜单栏以及工具栏上对应的需求,感兴趣的可以动手试一试
    2022-01-01
  • C语言实现信号槽的项目实践

    C语言实现信号槽的项目实践

    信号槽是观察者模式的一种实现,一个信号就是一个能够被观察的事件,本文主要介绍了C语言实现信号槽的项目实践模具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • c++实现合并文件以及拆分实例代码

    c++实现合并文件以及拆分实例代码

    这篇文章主要介绍了c++实现合并文件以及拆分实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 基于Qt和Opencv实现二维码解析

    基于Qt和Opencv实现二维码解析

    这篇文章主要为大家详细介绍了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • C++ 11新特性之右值引用使用案例与应用场景

    C++ 11新特性之右值引用使用案例与应用场景

    右值引用和move语义是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一种新的引用类型,下面这篇文章主要给大家介绍了关于C++ 11新特性之右值引用使用案例与应用场景的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论