哈希结构链接
文件: 许多异常的IP地址,找到出现次数最多的前K个IP地址
- 可能需要统计每个IP地址出现次数
- 借助优先级队列–堆 找到前K个IP地址
<英文单词,中文含义>
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:
去重 排序
#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可以重复
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;
}
红黑树
比较方式–键值对中的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;
}
红黑树
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;
}