C++ STL set/multset
来源:互联网 发布:json中包含html标签 编辑:程序博客网 时间:2024/05/21 22:57
本文转自:http://www.cnblogs.com/yongqiang/p/5746754.html
set容器内的元素会被自动排序,set与map不同,set中的元素即是键值又是实值,set不允许两个元素有相同的键值。不能通过set的迭代器去修改set元素,原因是修改元素会破坏set组织。当对容器中的元素进行插入或者删除时,操作之前的所有迭代器在操作之后依然有效。
multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。
set和multiset的底层实现是一种高效的平衡二叉树,即红黑树(Red-Black Tree)。
以下代码涉及的内容:
1、set容器中,元素类型为基本类型,如何让set按照用户意愿来排序?
2、set容器中,如何让元素类型为自定义类型?
3、set容器的insert函数的返回值为什么类型?
#include <iostream>#include <string>#include <set>using namespace std;/* 仿函数CompareSet,在test02使用 */class CompareSet{public: //从大到小排序 bool operator()(int v1, int v2) { return v1 > v2; } //从小到大排序 //bool operator()(int v1, int v2) //{ // return v1 < v2; //}};/* Person类,用于test03 */class Person{ friend ostream &operator<<(ostream &out, const Person &person);public: Person(string name, int age) { mName = name; mAge = age; }public: string mName; int mAge;};ostream &operator<<(ostream &out, const Person &person){ out << "name:" << person.mName << " age:" << person.mAge << endl; return out;}/* 仿函数ComparePerson,用于test03 */class ComparePerson{public: //名字大的在前面,如果名字相同,年龄大的排前面 bool operator()(const Person &p1, const Person &p2) { if (p1.mName == p2.mName) { return p1.mAge > p2.mAge; } return p1.mName > p2.mName; }};/* 打印set类型的函数模板 */template<typename T>void PrintSet(T &s){ for (T::iterator iter = s.begin(); iter != s.end(); ++iter) cout << *iter << " "; cout << endl;}void test01(){ //set容器默认从小到大排序 set<int> s; s.insert(10); s.insert(20); s.insert(30); //输出set PrintSet(s); //结果为:10 20 30 /* set的insert函数返回值为一个对组(pair)。 对组的第一个值first为set类型的迭代器: 1、若插入成功,迭代器指向该元素。 2、若插入失败,迭代器指向之前已经存在的元素 对组的第二个值seconde为bool类型: 1、若插入成功,bool值为true 2、若插入失败,bool值为false */ pair<set<int>::iterator, bool> ret = s.insert(40); if (true == ret.second) cout << *ret.first << " 插入成功" << endl; else cout << *ret.first << " 插入失败" << endl;}void test02(){ /* 如果想让set容器从大到小排序,需要给set容 器提供一个仿函数,本例的仿函数为CompareSet */ set<int, CompareSet> s; s.insert(10); s.insert(20); s.insert(30); //打印set PrintSet(s); //结果为:30,20,10}void test03(){ /* set元素类型为Person,当set元素类型为自定义类型的时候 必须给set提供一个仿函数,用于比较自定义类型的大小, 否则无法通过编译 */ set<Person,ComparePerson> s; s.insert(Person("John", 22)); s.insert(Person("Peter", 25)); s.insert(Person("Marry", 18)); s.insert(Person("Peter", 36)); //打印set PrintSet(s);}int main(void){ //test01(); //test02(); //test03(); return 0;}使用set容器需要注意的细节
以下代码涉及的内容:
1、multiset容器的insert函数返回值为什么?
#include <iostream>#include <set>using namespace std;/* 打印set类型的函数模板 */template<typename T>void PrintSet(T &s){ for (T::iterator iter = s.begin(); iter != s.end(); ++iter) cout << *iter << " "; cout << endl;}void test(void){ multiset<int> s; s.insert(10); s.insert(20); s.insert(30); //打印multiset PrintSet(s); /* multiset的insert函数返回值为multiset类型的迭代器, 指向新插入的元素。multiset允许插入相同的值,因此 插入一定成功,因此不需要返回bool类型。 */ multiset<int>::iterator iter = s.insert(10); cout << *iter << endl; }int main(void){ test(); return 0;}使用multiset容器需要注意的细节
**set构造函数
函数 功能**
- set st set默认构造函数
- mulitset mst multiset默认构造函数
- set(const set &st) 拷贝构造函数
**set赋值操作
函数 功能**
- set& operator=(const set &st) 重载等号操作符
- swap(st) 交换两个集合容器
**set大小操作
函数 功能**
- size() 返回容器中元素的数目
empty() 判断容器收为空
**set插入和删除操作
函数 功能**insert(elem) 在容器中插入元素
- clear() 清除所有元素
- erase(pos)删除pos迭代器所指的元素,返回下一个元素的迭代器
- erase(beg, end) 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
- erase(elem) 删除容器中值为elem的元素
**set查找操作
函数 功能**
- find(key) 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在, 返回set.end()
- count(key) 查找键key的元素个数
- lower_bound(keyElem) 返回最后一个key<=keyElem元素的迭代器
- upper_bound(keyElem) 返回第一个key>keyElem元素的迭代器
- equal_range(keyElem) 返回容器中key与keyElem相等的上下限的两个迭代器,这两个迭代器被放在对组(pair)中
阅读全文
0 0
- C++ STL set/multset
- C++ Set和multSet
- C++STL之set
- C++--STL---set容器
- C++STL-list和set
- c++STL Set集合容器
- C++STL之set容器
- C++STL练习<queue> <set>容器使用
- C++STL之关联容器【map】【set】
- C++STL之Set集合容器
- C++STL set介绍与使用方法
- C++::STL::容器类::set/multiset
- [C++::STL]之set的用法
- C++:STL常用函数模块总结(set)
- STL set
- STL SET
- STL set
- stl set
- 8.9 马蹄印 2493
- 对 Android 应用程序包进行签名
- linux Device Tree Usage
- camera平滑移动
- MySQL
- C++ STL set/multset
- C++ Primer Plus Chapter 3 Dealing with Data
- POJ
- 大话数据结构 code 第九章 01排序_Sort
- Java-String类的常用方法总结
- 设计模式学习笔记四:工厂方法(Factory Method)
- MongoDB文档存储
- js系列教程9-表单元素全解
- 爬虫实战4—多线程与多进程爬虫