内容概要:
- 字典的相关概念
- 注意事项
- 简单的字典实现
一、字典的相关概念
- 字典(dictionary)是在数据库中具有存储、查询和删除记录的功能的线性表。
- 数据库中的记录一般是靠关键码(key)描述的,类似人们的ID号码。
- 关键码应当具有可比性(comparable)。
二、注意事项
- 由于关键码类型非常多,不能编写出通用的字典。
- 关键码不是记录的类的基本属性,也不是类中任意的域,它只是在使用记录时与环境相关的属性。
- 字典中的任一基本元素包含一条记录及与该记录相关的关键码,记录和关键码的组合称为键值对。
三、一个简单的字典
- 字典抽象类
- 键值对模板类
- (int-char)字典类
#pragma once
//dictionary_ADT.h
template<typename Key, typename E>
class Dictionary
{
private:
void operator =(const Dictionary&){}
Dictionary(Dictionary&){}
public:
Dictionary(){}
virtual ~Dictionary() {}
virtual void clear()=0;
virtual void insert(const Key&, const E&) = 0;
virtual E remove(const Key&) = 0;
virtual E removeAny() = 0;
virtual E find(const Key&)const = 0;
virtual int size() = 0;
};
#pragma once
//key-value pair.h
template<typename Key,typename E>
class KVpair
{
private:
Key k;
E e;
public:
KVpair() {}
KVpair(const KVpair&kv) { k = kv.k; e = kv.e; }
KVpair(const Key&k0,const E&e0) { k = k0; e = e0; }
~KVpair() {};
Key key() { return k; }
E element() { return e; }
void setKey(const Key&k0) { k = k0; }
};
#pragma once
//array based dictionary.h
#include"dictionary_ADT.h"
#include"key-value pair.h"
#include<assert.h>
class ADict:public Dictionary<int,char>
{
private:
KVpair<int, char>*list;
int Maxsize;
int Size;
public:
ADict(int defaultSize = 100) { list = new KVpair<int, char>[defaultSize]; Maxsize=100; Size = 0; }
~ADict() { delete list; }
void clear() { delete list; }
void insert(const int&k0,const char&e0)
{
assert(Size <= Maxsize);//list is full
KVpair<int, char> it(k0, e0);
list[Size++] = it;
}
char remove(const int&k0)
{
for (int i = 0; i < Size; i++)
if (list[i].key() == k0)
{
char temp = list[i].element();
for (int k = 0; k < Size-i-1; k++)
list[i + k] = list[i + k + 1];
Size--;
return temp;
}
return 0;
}
char removeAny()
{
assert(Size != 0);//list is empty
return list[--Size].element();//remove the last one
}
char find(const int&k)const
{
for(int i=0;i<Size;i++)
if (list[i].key() == k)
return list[i].element();
return 0;
}
int size() { return Size; }
};
//问题:键值对模板类对象动态数组list为什么会无成员,,,初步判断应该是由于模板的问题,
//数组元素大小不确定,所以这里把Key和E都分别具体化为int和char类型的,当然也可
//以通过使用链表来解决。
//dictionary_main.cpp
#include"array based dictionary.h"
#include<iostream>
using namespace std;
int main()
{
ADict cc(10);
for (int i = 0; i < 20; i++)
cc.insert(101 + i, (char)(97 + i));
cout << endl;
cout << cc.find(101) << endl;
cout << "size:" << cc.size() << endl;
cout << "107:" << cc.remove(107) << endl;
cout << "104" << cc.remove(104) << endl;
cout << "after remove size:" << cc.size() << endl;
for (int i = 0; i < cc.size(); i++)
cout<<cc.removeAny()<<" ";
system("pause");
}
//注:这个程序有些隐性的问题,还没有解决,运行过程中有可能会出现“ *.exe已经触发一个断点”
//的问题,导致程序无法调试,也有可能导致堆和栈的损坏,这是内存超限的问题。
本文介绍了字典在数据库中的作用,作为线性表的一种,依赖关键码进行操作。关键码需要具备可比性。由于关键码的多样性,无法直接实现通用字典。字典由记录及其相关关键码组成,即键值对。文章还提供了一个简单的字典抽象类和键值对模板类的示例,特别是针对(int-char)的字典实现。
1686

被折叠的 条评论
为什么被折叠?



