【SEU程序设计课笔记】 24 - 2021/01/04 - Write C++ programs - 类与函数/排序器

类与函数

几个注意点:

  • 是成员函数还是全局函数?
  • 类的构造函数、析构函数没有返回值
  • 运算符重载注意是否是在this上作用的(比如做加法时,不应该改变自己的值)

排序器

运用模板完成。注意,列表类型和需排序内容的类型都要在template中给出。排序有关内容详见我的博客 【SEU程序设计课笔记】 12 - 2020/11/19 - Write C++ programs - 排序

#include <iostream>
#include <string>
using namespace std;

template<typename T>
class Array
{
	size_t size;
	T* data;
	string name;

public:
	Array() = default;
	Array(size_t m, T* arr, string name_)
	{
		name = name_;
		size = m;
		data = new T[size];
		for (int i = 0; i < size; i++)
			data[i] = arr[i];
	}

	Array(Array& source)
	{
		name = source.name;
		size = source.size;
		data = new T[size];
		for (int i = 0; i < size; i++)
		{
			data[i] = source.data[i];
		}
	}

	// readable version
	T getData(int index) const
	{
		return data[index];
	}

	// readable and writeable version
	T& getData(int index)
	{
		return data[index];
	}

	size_t length() const
	{
		return size;
	}
};

template<typename T>
Array<T> Sort(Array<T>& arr) // bubble sort
{
	T temp = 0;
	for (size_t t = 0; t < arr.length(); t++)
	{
		for (size_t k = 0; k < arr.length() - 1; k++)
		{
			if (arr.getData(k) > arr.getData(k + 1))
			{
				temp = arr.getData(k);
				arr.getData(k) = arr.getData(k + 1);
				arr.getData(k + 1) = temp;
			}
		}
	}
	return arr;
}

template<typename T>
ostream& operator<<(ostream& out, Array<T> a)
{
	for (size_t i = 0; i != a.length(); i++)
	{
		out << a.getData(i) << "\t";
	}
	return out;
}

int main(int argc, char** argv)
{
	double data[5] = { 1.3, 5.7, -4.2, 0.5, -1.5 };
	Array<double> arr(5, data, "ArrayName");
	cout << arr << endl;
	Sort(arr);
	/*
	equivalent to
	Sort<double>(arr);
	*/
	cout << arr << endl;
	return 0;
}

当然,也可以写一个[]重载的版本:

#include <iostream>
#include <string>
using namespace std;

template<typename T>
class Array
{
	size_t size;
	T* data;
	string name;

public:
	Array() = default;
	Array(size_t m, T* arr, string name_)
	{
		name = name_;
		size = m;
		data = new T[size];
		for (int i = 0; i < size; i++)
			data[i] = arr[i];
	}

	Array(Array& source)
	{
		name = source.name;
		size = source.size;
		data = new T[size];
		for (int i = 0; i < size; i++)
		{
			data[i] = source.data[i];
		}
	}

	// readable version
	T getData(int index) const
	{
		return data[index];
	}

	// readable and writeable version
	T& getData(int index)
	{
		return data[index];
	}

	size_t length() const
	{
		return size;
	}

	// readable version
	T operator[](int index) const
	{
		return data[index];
	}

	// readable and writeable version
	T& operator[](int index)
	{
		return data[index];
	}
};

template<typename T>
Array<T> Sort(Array<T>& arr)
{
	T temp = 0;
	for (size_t t = 0; t < arr.length(); t++)
	{
		for (size_t k = 0; k < arr.length() - 1; k++)
		{
			if (arr[k] > arr[k + 1])
			{
				temp = arr[k];
				arr[k] = arr[k + 1];
				arr[k + 1] = temp;
			}
		}
	}
	return arr;
}

template<typename T>
ostream& operator<<(ostream& out, Array<T> a)
{
	for (size_t i = 0; i != a.length(); i++)
	{
		out << a[i] << "\t";
	}
	return out;
}

int main(int argc, char** argv)
{
	double data[5] = { 1.3, 5.7, -4.2, 0.5, -1.5 };
	Array<double> arr(5, data, "ArrayName");
	cout << arr << endl;
	Sort(arr);
	/*
	equivalent to
	Sort<double>(arr);
	*/
	cout << arr << endl;
	return 0;
}

ALL RIGHTS RESERVED © 2021 Teddy van Jerry
欢迎转载,转载请注明出处。


See also

Teddy van Jerry 的导航页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值