STL之树形结构关联式容器

哈希结构链接

文章目录

  • 关联式容器:树形结构
    • 关于有序的序列,O(logN)
      • map的模拟简单实现(基于红黑树)
      • set的简单模拟实现(基于红黑树)

关联式容器:树形结构

文件: 许多异常的IP地址,找到出现次数最多的前K个IP地址

  1. 可能需要统计每个IP地址出现次数
  2. 借助优先级队列–堆 找到前K个IP地址

<英文单词,中文含义>

关于有序的序列,O(logN)

map:

要求:key一定不能重复

#include 
#include
#include
using namespace std;
//insert
void Testmap1()
{
	map<string, string> m;
	m.insert(pair<string, string>("宋江", "及时雨"));
	m.insert(pair<string, string>("李逵", "黑旋风"));

	//pair
	//iterator:代表map中的一个key-value的键值对
	//bool:insert插入是否成功
	auto ret=m.insert(make_pair("孙二娘", "母夜叉"));
	if (ret.second)
	{
		cout << ret.first->first << "----" << ret.first->second << endl;
	}
	ret=m.insert(make_pair("李逵", "铁牛"));
	if (ret.second)
	{
		cout << (*ret.first).first << "----" << ret.first->second << endl;
	}
	cout << m.size() << endl;
	cout << m["李逵"] << endl;

	//用户提供key--->[]返回与key所对应的value
	m["李逵"] = "铁牛";
	cout << m["李逵"] << endl;
	m["林冲"] = "豹子头";
	cout << m["林冲"] << endl;
	cout << m.size() << endl;
}
//遍历
void Testmap2()
{
	int array[] = { 3,1,9,4,0,7,6,2,5,8 };
	map<int, int> m;
	for (auto e : array)
		m.insert(make_pair(e, e));
	
	//测试:按照迭代方式进行遍历,能否的到一个关于key有序的序列
	auto it = m.begin();
	while (it!=m.end())
	{
		cout << it->first << "--->" << it->second << endl;
		++it;
	}
	cout << endl;

    //删除,也可以遍历find删除
	m.erase(5);

	for (auto &e:m)
	{
		cout << e.first << "--->" << e.second << endl;
	}
	cout << endl;
}
int main()
{
	Testmap2();
	return 0;
}

set: key

要求:key一定不能重复

#include 
#include
using namespace std;

//set:key一定是唯一的
//O(logN)
//去重 并排序
int main()
{
	int array[] = { 3,1,9,4,0,7,6,2,5,8 };
	set<int> s;
	for (auto e:array)
	{
		s.insert(e);
	}
	cout << s.size() << endl;
	for (auto e:s)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

multimap: key是可以重复的

去重 排序

#include 
#include
#include
using namespace std;

void Testmap1()
{
	multimap<string, string> m;
	m.insert(pair<string, string>("宋江", "及时雨"));
	m.insert(pair<string, string>("李逵", "黑旋风"));

	//pair
	//iterator:代表map中的一个key-value的键值对
	//bool:insert插入是否成功
	auto ret = m.insert(make_pair("孙二娘", "母夜叉"));
	ret=m.insert(make_pair("李逵", "铁牛"));
	cout << m.size() << endl;
}
int main()
{
	Testmap1();
	return 0;
}

key可以重复

STL之树形结构关联式容器_第1张图片

multiset: key key可以重复的

只排序

#include 
#include
using namespace std;

//multiset:只存储key,key可以重复,关于key有序的序列
int main()
{
	int array[] = { 3,1,9,4,0,7,6,2,5,8,3,1,9,4,0,7,6,2,5,8 };
	multiset<int> s;
	for (auto e : array)
	{
		s.insert(e);
	}
	cout << s.size() << endl;
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

set
STL之树形结构关联式容器_第2张图片
multiset
STL之树形结构关联式容器_第3张图片

map的模拟简单实现(基于红黑树)

红黑树

比较方式–键值对中的key

Map.hpp

#pragma once
#include "RBTree.hpp"
namespace bite
{
	//只需要封装住一个红黑树
	template<class K, class V>
	class map
	{
		typedef pair<K, V> ValueType;
		struct KeyOfValue
		{
			const K& operator()(const ValueType& data)
			{
				return data.first;
			}
		};
		typedef RBTree<ValueType, KeyOfValue> RBTree;
	public:
		typedef typename RBTree::Iterator iterator;
	public:
		map()
			:_t()
		{}
		iterator begin()
		{
			return _t.begin();
		}
		iterator end()
		{
			return _t.end();
		}
		pair<iterator, bool> insert(const ValueType& data)
		{
			return _t.Insert(data);
		}
		size_t size()const
		{
			return _t.Size();
		}
		bool empty()const
		{
			return _t.Empty();
		}
		iterator find(const K& key)
		{
			return _t.Find(make_pair(key,V()));
		}

		V& operator[](const K& key)
		{
			return (*((this->insert(make_pair(key, V()))).first)).second;
		}
	private:
		RBTree _t;
	};
}
void TestMap()
{
	bite::map<std::string, std::string> m;
	m.insert(pair<std::string, std::string>("1111", "1111"));
	m.insert(make_pair("1111", "1111"));
	m["0000"] = "0000";
	cout << m.size() << endl;
	for (auto e : m)
		cout << e.first << " " << e.second << endl;
	cout << endl;
}

set的简单模拟实现(基于红黑树)

红黑树

key >比较方式–直接用其元素比较

#pragma once
#include "RBTree.hpp"
namespace bite
{
	//只需要封装住一个红黑树
	template<class K>
	class set
	{
		typedef K ValueType;
		struct KeyOfValue
		{
			const K& operator()(const ValueType& data)
			{
				return data;
			}
		};
	public:
		typename typedef RBTree<ValueType,KeyOfValue>::Iterator iterator;
	public:
		set()
			:_t()
		{}
		iterator begin()
		{
			return _t.begin();
		}
		iterator end()
		{
			return _t.end();
		}
		pair<iterator, bool> insert(const ValueType& data)
		{
			return _t.Insert(data);
		}
		size_t size()const
		{
			return _t.Size();
		}
		bool empty()const
		{
			return _t.Empty();
		}
		iterator find(const K& key)
		{
			return _t.Find(key);
		}

	private:
		RBTree<ValueType, KeyOfValue> _t;
	};
}
void TestSet()
{
	bite::set<std::string> s;
	s.insert("1111");
	s.insert("1111");
	cout << s.size() << endl;
	for (auto e : s)
		cout << e << endl;
}

你可能感兴趣的:(C++)