STL之set
来源:互联网 发布:没有网站外链好优化么 编辑:程序博客网 时间:2024/06/01 07:21
为什么使用 set
set 是 C++ STL 内封装实现的平衡二叉树,效率较高,提供的成员函数(包括一些常用的操作:插入、删除和查找等)符合程序员的编程习惯,使用起来很方便。
为什么 set 的效率高
set 容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点。因此在插入和删除元素时只是指针移动的操作,而不需要移动内存。
注意事项
set 可以理解为数学上的集合,每个元素最多只出现一次。
自定义类型也可以使用 set,只需定义“小于”运算符即可。
常用操作
基本查询: begin()
返回 set 容器的第一个元素(迭代器) end()
返回 set 容器的最后一个元素(迭代器) empty()
判断 set 容器是否为空 size()
返回当前 set 容器中的元素个数 count(x)
判断 set 容器中是否有键值为 x 的元素
插入删除: insert(x)
向 set 容器中插入键值为 x 的元素 erase(it)
删除迭代器 it 指向的元素 erase(first,second)
删除迭代器 first 和 second 之间的元素 erase(x)
删除键值为 x 的元素 clear()
删除 set 容器中的所有的元素
二分查找: lower_bound(x)
返回第一个大于等于 x 的迭代器 upper_bound(x)
返回最后一个大于等于x 的迭代器
使用样例
#include <iostream>#include <set>int main (){ std::set<int> myset; myset.insert (100); myset.insert (200); myset.insert (300); std::cout << "myset contains:"; for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it) //迭代器可以理解为“类似指针的东西” std::cout << ' ' << *it; std::cout << '\n'; myset.clear(); myset.insert (1101); myset.insert (2202); std::cout << "myset contains:"; for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0;}
输出结果:
myset contains: 100 200 300
myset contains: 1101 2202
例题:UVA10815
题目大意:输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。单词不区分大小写。
分析:显然可以将单词插入一个 set 中,利用 set 中元素已从小到大排序这一性质,用一个 for 循环即可从小到大遍历输出所有元素。但本题的输入比较麻烦,如果不想手写输入,则可以使用速度较慢的 sstream,编写起来比较简单。
参考代码:
#include <algorithm>#include <cctype>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <set>#include <sstream>#include <string>using namespace std;typedef set <string> setstr;setstr dict;string str, temp;int main(void) { dict.clear(); //初始化清空容器 while (cin >> str) { int len = str.size(); for (int i = 0; i < len; i++) str[i] = isalpha(str[i]) ? tolower(str[i]) : ' '; //一方面将字母标准化统一变成小写,另一方面将符号统一变成空格方便sstream处理 stringstream ss; ss << str; while (ss >> temp) dict.insert(temp); //重复插入不会造成问题 } for (setstr::iterator it = dict.begin(); it != dict.end(); ++it) cout << *it << endl; //利用迭代器遍历输出 return 0;}
参考资料
- set - C++ Reference
- STL中的set容器的一点总结
- 刘汝佳《算法竞赛入门经典(第二版)》清华大学出版社
- 【STL】STL之set
- stl之set
- STL 应用之set
- STL容器之set
- STL之<set>
- STL之set
- STL之set
- C++ STL之set
- C++ STL 之set
- STL 之 set 集合
- STL之set
- STL 之set 练习
- stl 之set图解
- STL之set姿势
- STL 之 set
- stl之set
- stl之hash set
- STL具体操作之set
- 107-109_容器_自己实现HashMap_Map底层实现_哈希算法实现_使用数组和链表
- RxJava工具类
- iBATIS 动态insert插入语句+特殊字符过滤
- 富客户端与瘦客户端
- session过期(springMVC)
- STL之set
- Codeforces Round #426 (Div. 2) C. The Meaningless Game C. The Meaningless Game
- GPRM/GNRMC定位信息的读取与解析(3)
- openfire源码在eclipse中运行,Failed to load admin-sidebar.xml file from Openfire classes
- 使用JDBC连接MySQL数据库的工具类
- MATLAB画图,图上有每个线的意义
- #region 判断datagrid是否点击的数据行
- HDU
- Wing(Mac)下载+激活