您的位置:首页 > 其它

STL浅析set&map

2017-02-16 12:42 435 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: