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)中
原创粉丝点击