21xrx.com
2024-12-22 21:21:04 Sunday
登录
文章检索 我的文章 写文章
C++ 手动实现 Map 数据结构
2023-07-03 02:28:30 深夜i     --     --
C++ map 数据结构 手动实现

Map 是一种常见的数据结构,它表示一组键值对。在 C++ 中,Map 数据结构可以通过 STL 库中的 std::map 类来实现。然而,如果我们想更好地理解 Map 数据结构的实现原理,我们可以手动实现 Map。

首先,我们需要定义一个结构体来表示 Map 中的每个键值对。这个结构体包括两个成员变量:key 和 value。其中,key 表示键的类型,value 表示值的类型。


template<typename K, typename V>

struct MapNode {

  K key;

  V value;

  MapNode(K k, V v) :key(k), value(v) {}

};

然后,我们需要定义一个类来表示 Map 数据结构。这个类需要包括一些重要的成员函数,如:插入键值对、删除键值对、查询键值对、修改键值对、获取 Map 大小等。


template<typename K, typename V>

class Map {

public:

  // 构造函数

  Map()

    size_ = 0;

  

  // 插入键值对

  void insert(K key, V value);

  // 删除键值对

  bool erase(K key);

  // 查询键值对

  V& find(K key);

  // 修改键值对

  bool update(K key, V value);

  // 获取 Map 大小

  int size(){return size_;}

private:

  vector<MapNode<K, V>> data_;

  int size_;

};

其中,data_ 是一个存储键值对的 vector,size_ 记录 Map 中键值对的数量。

接下来,我们实现这些成员函数。


// 插入键值对

template<typename K, typename V>

void Map<K, V>::insert(K key, V value){

  for(auto &node : data_){

    // 如果 key 已经存在,那么更新 value

    if(node.key == key)

      node.value = value;

      return;

    

  }

  // key 不存在,插入新的键值对

  MapNode<K, V> node(key, value);

  data_.push_back(node);

  size_ ++;

}

// 删除键值对

template<typename K, typename V>

bool Map<K, V>::erase(K key){

  for(int i=0; i<data_.size(); i++){

    if(data_[i].key == key){

      data_.erase(data_.begin() + i);

      size_ --;

      return true;

    }

  }

  return false;

}

// 查询键值对

template<typename K, typename V>

V& Map<K, V>::find(K key){

  for(auto &node : data_){

    if(node.key == key)

      return node.value;

  }

  // 如果 key 不存在,那么返回一个空的 V

  static V v;

  return v;

}

// 修改键值对

template<typename K, typename V>

bool Map<K, V>::update(K key, V value){

  for(auto &node : data_){

    if(node.key == key)

      node.value = value;

      return true;

    

  }

  return false;

}

以上是手动实现 Map 数据结构的一个简单示例。当然,在实际开发中,如果需要应对更加复杂的场景,我们可能需要考虑更多的设计问题,比如:冲突处理、性能优化等。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复