深入探究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++容器适配器与仿函数内容请搜索aitechtogether.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持aitechtogether.com!

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年5月13日 上午8:11
下一篇 2023年5月13日 上午8:13

相关推荐