博客 https://blog.lenyiin.com/set-map/ 的代码仓库
This commit is contained in:
parent
73408f4b11
commit
ebf60b830e
@ -354,6 +354,33 @@ void test_Map2()
|
|||||||
cout << "IsRBTree? " << (countMap.IsRBTree() ? "true" : "false") << endl;
|
cout << "IsRBTree? " << (countMap.IsRBTree() ? "true" : "false") << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_Map3()
|
||||||
|
{
|
||||||
|
Lenyiin::Map<int, std::string> 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()
|
int main()
|
||||||
{
|
{
|
||||||
// test_set();
|
// test_set();
|
||||||
@ -365,6 +392,7 @@ int main()
|
|||||||
test_Set();
|
test_Set();
|
||||||
test_Map1();
|
test_Map1();
|
||||||
test_Map2();
|
test_Map2();
|
||||||
|
test_Map3();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -4,31 +4,37 @@
|
|||||||
|
|
||||||
namespace Lenyiin
|
namespace Lenyiin
|
||||||
{
|
{
|
||||||
|
// Map 容器的实现,依赖于红黑树
|
||||||
template <class K, class V>
|
template <class K, class V>
|
||||||
class Map
|
class Map
|
||||||
{
|
{
|
||||||
|
// 用于从节点中获取键值的仿函数
|
||||||
struct MapKeyOfT
|
struct MapKeyOfT
|
||||||
{
|
{
|
||||||
const K &operator()(const std::pair<K, V> &kv)
|
const K &operator()(const std::pair<K, V> &kv)
|
||||||
{
|
{
|
||||||
return kv.first;
|
return kv.first; // 返回键作为红黑树的比较依据
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
// 定义迭代器类型,支持遍历和访问集合中的元素
|
||||||
typedef typename RBTree<K, std::pair<K, V>, MapKeyOfT>::iterator iterator;
|
typedef typename RBTree<K, std::pair<K, V>, MapKeyOfT>::iterator iterator;
|
||||||
typedef typename RBTree<K, std::pair<K, V>, MapKeyOfT>::const_iterator const_iterator;
|
typedef typename RBTree<K, std::pair<K, V>, MapKeyOfT>::const_iterator const_iterator;
|
||||||
|
|
||||||
|
// 返回指向第一个元素的迭代器
|
||||||
iterator begin()
|
iterator begin()
|
||||||
{
|
{
|
||||||
return _tree.begin();
|
return _tree.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 返回指向尾后位置的迭代器
|
||||||
iterator end()
|
iterator end()
|
||||||
{
|
{
|
||||||
return _tree.end();
|
return _tree.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// const 版本的迭代器
|
||||||
const_iterator begin() const
|
const_iterator begin() const
|
||||||
{
|
{
|
||||||
return _tree.begin();
|
return _tree.begin();
|
||||||
@ -39,22 +45,32 @@ namespace Lenyiin
|
|||||||
return _tree.end();
|
return _tree.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 插入元素,返回插入结果
|
||||||
std::pair<iterator, bool> Insert(const std::pair<K, V> &kv)
|
std::pair<iterator, bool> Insert(const std::pair<K, V> &kv)
|
||||||
{
|
{
|
||||||
return _tree.Insert(kv);
|
return _tree.Insert(kv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除元素,返回是否删除成功
|
||||||
bool Erase(const K &key)
|
bool Erase(const K &key)
|
||||||
{
|
{
|
||||||
return _tree.Erase(key);
|
return _tree.Erase(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查找元素,返回指向该元素的迭代器
|
||||||
|
iterator Find(const K &key)
|
||||||
|
{
|
||||||
|
return _tree.Find(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// [] 下标运算符
|
||||||
V &operator[](const K &key)
|
V &operator[](const K &key)
|
||||||
{
|
{
|
||||||
std::pair<iterator, bool> ret = _tree.Insert(std::make_pair(key, V()));
|
std::pair<iterator, bool> ret = _tree.Insert(std::make_pair(key, V()));
|
||||||
return ret.first->second;
|
return ret.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 校验红黑树的合法性
|
||||||
bool IsRBTree()
|
bool IsRBTree()
|
||||||
{
|
{
|
||||||
return _tree.IsRBTree();
|
return _tree.IsRBTree();
|
||||||
|
@ -646,7 +646,7 @@ namespace Lenyiin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查找节点
|
// 查找节点
|
||||||
iterator &Find(const K &key)
|
iterator Find(const K &key)
|
||||||
{
|
{
|
||||||
KOfT koft;
|
KOfT koft;
|
||||||
Node *cur = _root;
|
Node *cur = _root;
|
||||||
|
@ -4,9 +4,11 @@
|
|||||||
|
|
||||||
namespace Lenyiin
|
namespace Lenyiin
|
||||||
{
|
{
|
||||||
|
// Set 容器的实现,依赖于红黑树
|
||||||
template <class K>
|
template <class K>
|
||||||
class Set
|
class Set
|
||||||
{
|
{
|
||||||
|
// 用于从节点中获取键值的仿函数
|
||||||
struct SetKeyOfT
|
struct SetKeyOfT
|
||||||
{
|
{
|
||||||
const K &operator()(const K &k)
|
const K &operator()(const K &k)
|
||||||
@ -16,20 +18,24 @@ namespace Lenyiin
|
|||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
// 定义迭代器类型,支持遍历和访问集合中的元素
|
||||||
// 这里RBTree<K, K, SetKeyOfT>::iterator还没有实例化, 系统找不到, typename告诉编译器现在先不着急找
|
// 这里RBTree<K, K, SetKeyOfT>::iterator还没有实例化, 系统找不到, typename告诉编译器现在先不着急找
|
||||||
typedef typename RBTree<K, K, SetKeyOfT>::iterator iterator;
|
typedef typename RBTree<K, K, SetKeyOfT>::iterator iterator;
|
||||||
typedef typename RBTree<K, K, SetKeyOfT>::const_iterator const_iterator;
|
typedef typename RBTree<K, K, SetKeyOfT>::const_iterator const_iterator;
|
||||||
|
|
||||||
|
// 返回指向第一个元素的迭代器
|
||||||
iterator begin()
|
iterator begin()
|
||||||
{
|
{
|
||||||
return _tree.begin();
|
return _tree.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 返回指向尾后位置的迭代器
|
||||||
iterator end()
|
iterator end()
|
||||||
{
|
{
|
||||||
return _tree.end();
|
return _tree.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// const 版本的迭代器
|
||||||
const_iterator begin() const
|
const_iterator begin() const
|
||||||
{
|
{
|
||||||
return _tree.begin();
|
return _tree.begin();
|
||||||
@ -40,27 +46,32 @@ namespace Lenyiin
|
|||||||
return _tree.end();
|
return _tree.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 插入元素,返回插入结果
|
||||||
std::pair<iterator, bool> Insert(const K &key)
|
std::pair<iterator, bool> Insert(const K &key)
|
||||||
{
|
{
|
||||||
return _tree.Insert(key);
|
return _tree.Insert(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除元素,返回是否删除成功
|
||||||
bool Erase(const K &key)
|
bool Erase(const K &key)
|
||||||
{
|
{
|
||||||
return _tree.Erase(key);
|
return _tree.Erase(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator &Find(const K &key)
|
// 查找元素,返回指向该元素的迭代器
|
||||||
|
iterator Find(const K &key)
|
||||||
{
|
{
|
||||||
return _tree.Find(key);
|
return _tree.Find(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 校验红黑树的合法性
|
||||||
bool IsRBTree()
|
bool IsRBTree()
|
||||||
{
|
{
|
||||||
return _tree.IsRBTree();
|
return _tree.IsRBTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// 底层红黑树实例
|
||||||
RBTree<K, K, SetKeyOfT> _tree;
|
RBTree<K, K, SetKeyOfT> _tree;
|
||||||
};
|
};
|
||||||
}
|
}
|
BIN
Linux/main
BIN
Linux/main
Binary file not shown.
Loading…
Reference in New Issue
Block a user