STL浅析set&map

map和set的底层实现原理和接口使用
1、set和map的底层实现
     set和map属于STL中的一种关联式容器,底层实现是红黑树
2.set容器的特点
     (1)set和map 容器中的元素自动进行有序排列(默认为升序排列);
     (2)set和map 容器中的元素能够有效防止数据冗余;
3.set容器的主要接口
A----Modifiers:
(1)insert:向集合中插入元素
方式一:在迭代器i前插入val
iterator insert(iterator i, const TYPE& val)
{
	set<int> s;
	s.insert(2);
	s.insert(9);
	s.insert(6);
}
方式二:将迭代器start开始到end结束返回内的元素插入到集合中
void insert(intput iterator start, input iterator end);
方式三:在当前集合中插入val元素,并返回指向该元素的迭代器和一个布尔值来说明val是否成功的被插入了
pair inser(const TYPE& val);
***知识迁移***
有关pair结构的说明:
template <class t1, class t2> 
struct pair
{
	typedef t1 first_type;
	typedef t2 second_type;

	t1 first;
	t2 second;
}
(2)erase:删除指定的元素
方式一:删除指定位置的值:
void erase(iterator position)
	set<int> s;
	s.insert(2);
	s.insert(9);
	s.insert(6);
	s.erase(6);
	s.erase(9);
方式二:删除等于key值得所有元素,返回被删除元素的个数:
size_type erase(const key_type &key);
方式三:删除从start开始到end结束的元素:
void erase(iterator start, iterator end);
(3)swap:交换当前集合和object集合中的元素(实现原理和普通的swap一样)
void swap(set &object);
{
	int arr[] = { 3, 5, 6, 32, 1, 7, 98, 4, 5 };
	set<int> s1(arr,arr+3);
	set<int> s2(arr+2,arr+5);
	//swap(s1, s2);//一般的swap也可以完成交换
	s1.swap(s2);//swap set
	s1.erase(s1.find(6));
	set<int>::iterator it4 = s1.begin();
	while (it4 != s1.end())
	{
		cout << *it4 << " ";
		it4++;
	}
	cout << endl;}
(4)clear:清空当前集合中的元素
void clear()
Modifiers:接口相关的代码演示
B----Iterators:
(1)begin:返回指向当前集合中第一个元素的迭代器
iteator begin();
(2)end:返回指向当前集合中最后一个元素的迭代器
const_iterator end();



void testset()
{
	set<int>::iterator it1 = s.begin();
	while (it1 != s.end())//默认升序排列
	{
		cout << *it1 << " ";
		it1++;
	}
}
(3)rbegin:返回指向当前集合中最后一个元素的反向迭代器
iteator rbegin();
(4)rend:返回指向集合中第一个元素的反向迭代器
const_iterator rend();
***C++11新特性***
(5)cbegin:返回指向当前集合中第一个元素的const迭代器
iteator begin()const;
(6)cend:返回指向当前集合中最后一个元素的const迭代器
const_iterator end()const;
C----Capacity:
(1)empty:如果当前集合为空,返回true;否则返回false
bool empty();
(2)size:统计当前集合中元素的个数
size_t size();
(3)maxsize:返回当前集合能容纳元素的最大限值
D----Operations:
(1)find:寻找制定的元素
{
	map<string, int> first;
	first.insert(pair<string, int>("ytrrs", 4));
	first.insert(pair<string, int>("sfgt", 5));
	first.erase("word");
	first.erase(first.find("sfgt"));
	first.insert(make_pair("zxdgd", 4));
	first.insert(make_pair("asdfg", 7));
	map<string, int>::iterator it = first.begin();//根据传入的字符串的首字符的ascii码值进行排序
	while (it != first.end())
	{
		cout << it->first << " " << it->second << endl;
		it++;
	}
}
(2)count:判断所指元素是否在该集合
{
	set<int> s;
	s1.insert(4);
	s1.insert(8);
	for (size_t i = 0; i < 10; ++i)
	{
		if (s1.count(i))//count方法判断指定的元素是否在该容器中
			cout << "存在该元素" << endl;
		else
			cout << "不存在该元素" << endl;
	}
}
(3)lower_bound:返回指向大于(或等于)某值的第一个元素的迭代器
(4)upper_bound:返回大于某个值元素的迭代器
{
	map<string, int>::iterator ret1, ret2;
	ret1 = first.lower_bound("cccc"); //lower_bound返回指向大于(或等于)某值的第一个元素的迭代器
	cout << ret1->first << endl;
	ret2 = first.upper_bound("asdfg");//upper_bound返回指向大于某个值元素的迭代器
	while (ret2 != first.end())
	{
		cout << ret2->first << " " << ret2->second << endl;
		ret2++;
	}
}
二、百度面试题----员工最喜欢的水果(TopK问题)
#include <iostream>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

template <typename K, typename V>
void CountTopK(string fruits[], size_t sz, const map<K, V> &m)
{
	map <string, int> count;
	for (size_t i = 0; i < sz; ++i)
	{
		方法1
		//map <string,int>::iterator it = count.find(fruits[i]);
		//if (it != count.end())
		//{
		//it->second++;
		*(it).second++;
		//}
		//else
		//{
		//count.insert(pair<string,int>(fruits[i],1));
		//}

		方法2
		//pair <map<string,int>::iterator,bool> ret;
		//ret = count.insert(pair<string,int>(fruits[i],1));
		//if (ret.second == false)
		//{
		//ret.first->second++;
		//}

		//方法3
		count[fruits[i]]++;
	}
	//将迭代器导入vector
	vector<map<string, int>::iterator> heap;
	map<string, int>::iterator mapIt = count.begin();
	while (mapIt != count.end())
	{
		heap.push_back(mapIt);
		++mapIt;
	}
	//建小堆
	struct Com
	{
		bool operator()(const map<string, int>::iterator l, const map<string, int>::iterator r)
		{
			return l->second < r->second;
		}
	};
	sort(heap.begin(), heap.end(), Com());

	//make_heap(heap.begin(),heap.end(),com());
	//int diff = heap.size() - k;
	向下调整
	//while(diff--)
	//{
	//pop_heap(heap.begin(),heap.end(),com());
	//heap.pop_back();
	//}
	//输出结果
	while (heap.size() != 0)
	{
		cout << heap.back()->first << ":" << heap.back()->second << endl;
		heap.pop_back();
	}
}

int main()
{
	map <string, int> count;
	string fruits[] = { "apple", "banana", "orange", "pineapple", "grape",
		"banana", "orange", "apple", "apple", "orange",
		"pineapple", "grape", "orange", "pineapple", "pear",
		"grapefruit", "mango", "mango juice", "apple",
		"Hami melon", "melon", "peach", "banana",
		"pineapple", "grape", "orange", "pineapple", "pear",
		"grapefruit", "mango", "apple", "melon", "peach", "banana",
		"melon", "peach", "banana", "Hami melon",
		"pineapple", "grape", "orange", "pineapple", "pear",
		"grapefruit", "mango", "peach", "peach" };
	size_t sz = sizeof(fruits) / sizeof(fruits[0]);
	CountTopK(fruits, sz, count);
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_happiness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值