内容概要:
字典的相关概念
注意事项
简单的字典实现
一、字典的相关概念
字典(dictionary)是在数据库中具有存储、查询和删除记录的功能的线性表。
数据库中的记录一般是靠关键码(key)描述的,类似人们的ID号码。
关键码应当具有可比性(comparable)。
二、注意事项
由于关键码类型非常多,不能编写出通用的字典。
关键码不是记录的类的基本属性,也不是类中任意的域,它只是在使用记录时与环境相关的属性。
字典中的任一基本元素包含一条记录及与该记录相关的关键码,记录和关键码的组合称为键值对。
三、一个简单的字典
字典抽象类
键值对模板类
(int-char)字典类
#pragma once
//dictionary_ADT.h
template
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
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
class ADict:public Dictionary
{
private:
KVpair
int Maxsize;
int Size;
public:
ADict(int defaultSize = 100) { List = new KVpair
~ADict() { delete List; }
voID clear() { delete List; }
voID insert(const int&k0,const char&e0)
{
assert(Size <= Maxsize);//List is full
KVpair
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 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 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< system("pause"); } //注:这个程序有些隐性的问题,还没有解决,运行过程中有可能会出现“ *.exe已经触发一个断点” //的问题,导致程序无法调试,也有可能导致堆和栈的损坏,这是内存超限的问题。 以上是内存溢出为你收集整理的数据结构——线性表:字典(C++)全部内容,希望文章能够帮你解决数据结构——线性表:字典(C++)所遇到的程序开发问题。 如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)