有关模板类的回顾

Some Points:

  • The declaration and definition of template class must be in the same file, or build error.  e.g. see detail
Error LNK2019 unresolved external symbol "public: __cdecl QuickSort<int>::QuickSort<int>(int *,bool)" (??0?$QuickSort@H@@QEAA@PEAH_N@Z) referenced in function main	HelloWorld	D:\SourceCode\VisualStudio\HelloWorld\HelloWorld\HelloWorld.obj	1	
  • Review the quick sort algorithm. Time Complexity: average: O(nlogn),  worst: O(n^2).
  • We can get the length of the array by using the function "(int) _msize(pointer)", pointer point to the array. Only the array which created dynamically could use this function.

Source Code:

  • main.cpp


#include "pch.h"
#include "pch.cpp"
int main()
{
	int *int_a = new int[10];
	int *int_b = new int[10];
	for (int i = 0; i < 10; i++) {
		std::cin >> int_a[i];
		int_b[i] = int_a[i];
	}
	// only the array which created dynamically could use the function '_msize()'.
	QuickSort<int> tmp(int_a), tep(int_b, true);
	tmp.sort();
	tep.sort();
	tmp.show();
	tep.show();

	double *double_a = new double[10];
	double *double_b = new double[10];
	for (int i = 0; i < 10; i++) {
		std::cin >> double_a[i];
		double_b[i] = double_a[i];
	}
	// only the array which created dynamically could use the function '_msize()'.
	QuickSort<double> tmp_2(chr_a), tep_2(chr_b, true);
	tmp_2.sort();
	tep_2.sort();
	tmp_2.show();
	tep_2.show();
	return 0;
}


  •  pch.h


#ifndef PCH_H
#define PCH_H

#include <iostream>

template <class T>
class QuickSort {
public:
	QuickSort(T *arr, bool reverse = false);
	~QuickSort();
	void sort();
	void show();
protected:
	void onSort(int p, int q);
	int getPartition(int p, int q);
private:
	int num;
	T *arr;
	bool reverse;
};

  • pch.cpp


#include "pch.h"

template <class T>
QuickSort<T>::QuickSort (T *arr, bool reverse) {
	this->arr = arr;
	this->num = (int)_msize(arr) / sizeof(T);
	this->reverse = reverse;
}

template <class T>
QuickSort<T>::~QuickSort() {
	if (arr != nullptr)
		free(arr);

}
template<class T>
void QuickSort<T>::sort() {
	onSort(0, num - 1);
}

template <class T>
void QuickSort<T>::onSort(int p, int q) {
	if (p < q) {
		int mid = getPartition(p, q);
		onSort(p, mid - 1);
		onSort(mid + 1, q);
	}
}
template <class T>
int QuickSort<T>::getPartition(int p, int q) {
	T stand = arr[p];
	int i = p, j = q + 1;
	while (true) {
		while (arr[++i] <= stand && i < q);
		while (arr[--j] >= stand && j > p);
		if (i >= j) break;
		T temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	arr[p] = arr[j];
	arr[j] = stand;
	return j;
}

template <class T>
void QuickSort<T>::show() {
	if (this->reverse) {
		for (int i = num - 1; i >= 0; i--)
			std::cout << arr[i] << ' ';
		std::cout << std::endl;
		return;
	}
	for (int i = 0; i < num; i++)
		std::cout << arr[i] << ' ';
	std::cout << std::endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值