【问题标题】:How would I represent this in a more object oriented way?我将如何以更面向对象的方式表示这一点?
【发布时间】:2013-01-30 00:24:47
【问题描述】:
typedef char STR10[10+1];
typedef char STR20[20+1];

typdef struct Slot
{
    STR10 key;
    STR10 value;
};

const int MAX_SLOTS = 3;
const int MAX_BUCKETS = 30;

typedef struct Bucket
{

        short int count;
        short int overflow;
        Slot slots[MAX_SLOTS]; 
};

typedef Bucket HashTable[MAX_BUCKETS];

大多数情况下,我只是对最后一行的概念感到困惑。我知道我可以将结构更改为类,这会很好,但最后一行对我来说很重要。它基本上是说 HashTable 是一个桶数组。该代码是否足够好,还是有办法在 HashTable 类中表示它?

class HashTable 
{
private:
   Bucket table[MAX_BUCKETS];
}

这代表相同的想法吗?我真的很难开始这样做。

【问题讨论】:

  • 一般情况下,您会使用动态数量的桶,固定大小仅对非常特定数量的条目有用。
  • @AndrewDunn:一般来说是这样,但更令人担忧的是每个桶的固定槽数。尊敬的用户 2023585:一个更好的替代方案是置换列表,您可以在其中运行一系列从散列到存储桶的偏移量(必要时返回到实际存储桶),直到找到可用的存储桶。您可以对位移进行硬编码(但仍有失败的风险)或使用某些函数来生成一系列。您希望最小化现有连续偏移量之和等于另一个偏移量的情况:如果这令人困惑,也许只是从素数开始......
  • 基本上只使用std::map 甚至更好,std::unordered_map(如果 C++11 是一个选项)。否则这就像家庭作业的味道。
  • 是的,这是功课,你一定很香。

标签: c++ oop hashtable


【解决方案1】:

如果可以的话,我可以用std::string替换char数组,用std::vector替换slot数组,用枚举替换define:

enum SlotSize
{
   MaxSlots = 3
};

enum BucketSize
{
    MaxBuckets = 30
};

struct Slot
{
    std::string key;
    std::string value;
};

struct Bucket
{

    int count;
    int overflow;
    std::vector<Slot> slots;
};

class HashTable 
{
private:
   std::vector<Bucket> table;
}

【讨论】:

  • 啊,是的向量,完全忘记了它们。我已经有 6 个月没有用 C++ 编码了,主要被困在脚本语言中......
  • 是的,使用 C++ 字符串和 STL 容器让生活更轻松
  • 所以类声明与我原帖中的 typedef 基本相同?
  • typedef 是更多的 C 方式,C++ 不需要它来进行普通的类声明
  • billz: +1 但有个小小的讽刺——全大写标识符有可能与预处理器宏发生冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多