晓石头的博客
邮箱:[email protected]
转载请注明出处,原文链接:http://blog.csdn.net/qiulanzhu/article/details/50491759
①.set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。
元素插入的过程是按排序规则插入,所以不能指定插入位置
②.set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。
在插入和删除操作上比vector快。
③.set不可以直接存取元素。(也就是不可以使用.at[idx]与[]操作符)
④.不可以直接修改set或者multiset容器中的元素值,因为该容器是自动排序的。
如果希望修改一个元素值,需先删除再插入。
⑤.multiset与set的区别:
set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
set采用模版类实现,set/multiset对象的默认构造形式:set<T>setT;multiset<T>multisetT;
set<int> setInt;//存放int的set容器
set<float> setFloat;//存放float的set容器
set<string> setString;//存放string的set容器
multiset<int> multisetInt;//存放int的multiset容器
multiset<float> multisetFloat;//存放float的multiset容器
multiset<string> multisetString;//存放string的multiset容器
...
//尖括号内可以是各种指针类型或者自定义类型。
set(const set &st);//拷贝构造函数
set &operator=(const set &st);//重载等于操作
set.insert(elem);//容器中插入元素
set.begin();//返回容器中第一个数据的迭代器
set.end();//返回容器中最后一个数据再后面一个元素的迭代器
set.rbegin();//返回容器中倒数第一个数据的迭代器
set.rend();//返回容器中倒数最后一个数据再后面一个元素的迭代器
set<int, less<int>> setInt;//按升序方式排列元素
set<int, greater<int>> setInt;//按降序方式排列元素
set<int> 相当于set<int, less<int>>
例:
#include "stdafx.h" #include <iostream> #include <string> #include <set> using namespace std; class Student { public: Student(int id, string name):m_id(id),m_name(name){} public: int m_id; string m_name; }; struct studentFunctor { bool operator()(const Student &stu1, const Student &stu2) { return (stu1.m_id < stu2.m_id); } }; int main(int argc, char* argv[]) { set<Student, studentFunctor> setStudent; setStudent.insert(Student(3, "小明3")); setStudent.insert(Student(5, "小明5")); setStudent.insert(Student(2, "小明2")); setStudent.insert(Student(1, "小明1")); setStudent.insert(Student(4, "小明4")); set<Student, studentFunctor>::iterator it; for(it=setStudent.begin(); it!=setStudent.end(); it++) { cout<<(*it).m_name<<" "<<endl; } return 0; }
set.seze();//容器中元素的数目
set.empty();//判断容器是否为空
set.clear();//清除所有元素
set.erase(pos);//删除pos位置的元素,返回下一个元素的位置(迭代器)
set.erase(beg, end);//删除区间[beg, end)的元素,返回下一个元素的迭代器
set.erase(elem);//删除容器中值为elem的元素
set.swap(st);//等价于swap(set, st);
set.find(elem);//查找elem元素,返回指向elem元素的迭代器
set.count(elem);//返回容器中值为elem的元素个数。set的查找结果为0或1。multiset结果>=0
set.lower_bound(elem);//返回第一个>=elem元素的迭代器
set.upper_bound(elem);//返回第一个>elem元素的迭代器
set.equal_range(elem);//返回两个迭代器,一个指向>=elem的元素;另一个指向>elem的元素。两个迭代器被封装在一个pair中。
pair:对组,将两个值视为一个单元。
pair<T1, T2>:T1、T2两个类型可以不一样。
如:T1为int,T2为float。T1和T2也可以是自定义类型。
pair.first为pair里的第一个值,是T1类型;
pair.second为pair里的第二个值,是T2类型。
例子:
#include "stdafx.h" #include <iostream> #include <string> #include <set> using namespace std; int main(int argc, char* argv[]) { set<int> setInt; setInt.insert(1); setInt.insert(3); setInt.insert(5); setInt.insert(7); setInt.insert(9); pair<set<int>::iterator, set<int>::iterator>> itPair = setInt.equal_range(3);//elem=3结果输出3、5;elem=2结果输出3、3 cout<<*(itPair.first)<<endl; cout<<*(itPair.second)<<endl; return 0; }