多重表

#pragma once
#include "stdafx.h"
#include "arrayList.h"
using std::pair;
template
struct Mutitable{
	//constructors distructor 
	~Mutitable();
	Mutitable(int sz=100);
	//functions...
	void insert(int i,int index,T element);//insert element
	void roomOptimize(){}//Space Optimize
	void makeArray(int sz);
	arrayList> tables{ 2 };
private:
	
	pair edge;
};
//definations
//con/distructors 
template
Mutitable::~Mutitable(){
	delete[]edge.first;
}

template
Mutitable::Mutitable(int sz ){
	edge.first = new T[sz];
	edge.second = edge.first + sz;
	tables[0].first = tables[0].second = edge.first-1;
	tables[1].first = tables[1].second = edge.second;
}


template
void Mutitable::makeArray(int sz){
	int i = 0;
	for (i; i != tables.size()-1; ++i){
		if (tables[i].second < tables[i + 1].first-sz){
			tables.insert(std::make_pair(tables[i].second + 1, tables[i].second + sz), i + 1); break;
		}
	}
	if (i == tables.size() - 1)std::cout << "No room!!" << std::endl;
}

template
void Mutitable::insert(int i, int index, T element){
	if (i >= int(tables.size()) || i < 0)throw "No such arryList No. !!";
	else if (index < 0 || index >= tables[i].second-tables[i].first)throw "index out of range!!";
	else {
		int k = i;
		for (k; k != tables.size() - 1 && tables[k].second >= tables[k + 1].first; ++k);
		if (k != tables.size()){
			std::copy_backward(tables[i].first + index, tables[k].second, tables[i].first + index + 1);
			*(tables[i].first + index) = element;
		}
		else {
			int k = i;
			while (k != 0){
				if (tables[k].first > tables[k - 1].second){
					std::copy(tables[k].first, tables[i].first + index, tables[k].first - 1);
					*(tables[i].first + index) = element; break;
				}
				++k;
			}
			if (k == 0)throw "no room to insert!!";
		}
	}
}

你可能感兴趣的:(多重表)