diff --git a/Linux/Main.cc b/Linux/Main.cc index 7bf3511..4496efe 100644 --- a/Linux/Main.cc +++ b/Linux/Main.cc @@ -354,6 +354,33 @@ void test_Map2() cout << "IsRBTree? " << (countMap.IsRBTree() ? "true" : "false") << endl; } +void test_Map3() +{ + Lenyiin::Map map; + + // 插入键值对 + map.Insert(std::make_pair(1, "one")); + map.Insert(std::make_pair(2, "two")); + map.Insert(std::make_pair(3, "three")); + + // 通过 operator[] 访问或插入 + map[4] = "four"; + std::cout << "Key 4: " << map[4] << std::endl; + + // 查找元素 + auto it = map.Find(2); + if (it != map.end()) + { + std::cout << "Found: " << it->first << " -> " << it->second << std::endl; + } + + // 删除元素 + map.Erase(1); + + // 验证红黑树 + cout << "IsRBTree? " << (map.IsRBTree() ? "true" : "false") << endl; +} + int main() { // test_set(); @@ -365,6 +392,7 @@ int main() test_Set(); test_Map1(); test_Map2(); + test_Map3(); return 0; } \ No newline at end of file diff --git a/Linux/Map.hpp b/Linux/Map.hpp index 7173998..622e5e1 100644 --- a/Linux/Map.hpp +++ b/Linux/Map.hpp @@ -4,31 +4,37 @@ namespace Lenyiin { + // Map 容器的实现,依赖于红黑树 template class Map { + // 用于从节点中获取键值的仿函数 struct MapKeyOfT { const K &operator()(const std::pair &kv) { - return kv.first; + return kv.first; // 返回键作为红黑树的比较依据 } }; public: + // 定义迭代器类型,支持遍历和访问集合中的元素 typedef typename RBTree, MapKeyOfT>::iterator iterator; typedef typename RBTree, MapKeyOfT>::const_iterator const_iterator; + // 返回指向第一个元素的迭代器 iterator begin() { return _tree.begin(); } + // 返回指向尾后位置的迭代器 iterator end() { return _tree.end(); } + // const 版本的迭代器 const_iterator begin() const { return _tree.begin(); @@ -39,22 +45,32 @@ namespace Lenyiin return _tree.end(); } + // 插入元素,返回插入结果 std::pair Insert(const std::pair &kv) { return _tree.Insert(kv); } + // 删除元素,返回是否删除成功 bool Erase(const K &key) { return _tree.Erase(key); } + // 查找元素,返回指向该元素的迭代器 + iterator Find(const K &key) + { + return _tree.Find(key); + } + + // [] 下标运算符 V &operator[](const K &key) { std::pair ret = _tree.Insert(std::make_pair(key, V())); return ret.first->second; } + // 校验红黑树的合法性 bool IsRBTree() { return _tree.IsRBTree(); diff --git a/Linux/RBTree.hpp b/Linux/RBTree.hpp index 56b6700..b88cfdd 100644 --- a/Linux/RBTree.hpp +++ b/Linux/RBTree.hpp @@ -646,7 +646,7 @@ namespace Lenyiin } // 查找节点 - iterator &Find(const K &key) + iterator Find(const K &key) { KOfT koft; Node *cur = _root; diff --git a/Linux/Set.hpp b/Linux/Set.hpp index cb78908..81d2737 100644 --- a/Linux/Set.hpp +++ b/Linux/Set.hpp @@ -4,9 +4,11 @@ namespace Lenyiin { + // Set 容器的实现,依赖于红黑树 template class Set { + // 用于从节点中获取键值的仿函数 struct SetKeyOfT { const K &operator()(const K &k) @@ -16,20 +18,24 @@ namespace Lenyiin }; public: + // 定义迭代器类型,支持遍历和访问集合中的元素 // 这里RBTree::iterator还没有实例化, 系统找不到, typename告诉编译器现在先不着急找 typedef typename RBTree::iterator iterator; typedef typename RBTree::const_iterator const_iterator; + // 返回指向第一个元素的迭代器 iterator begin() { return _tree.begin(); } + // 返回指向尾后位置的迭代器 iterator end() { return _tree.end(); } + // const 版本的迭代器 const_iterator begin() const { return _tree.begin(); @@ -40,27 +46,32 @@ namespace Lenyiin return _tree.end(); } + // 插入元素,返回插入结果 std::pair Insert(const K &key) { return _tree.Insert(key); } + // 删除元素,返回是否删除成功 bool Erase(const K &key) { return _tree.Erase(key); } - iterator &Find(const K &key) + // 查找元素,返回指向该元素的迭代器 + iterator Find(const K &key) { return _tree.Find(key); } + // 校验红黑树的合法性 bool IsRBTree() { return _tree.IsRBTree(); } private: + // 底层红黑树实例 RBTree _tree; }; } \ No newline at end of file diff --git a/Linux/main b/Linux/main index 2bf2883..c26d2f6 100644 Binary files a/Linux/main and b/Linux/main differ