C++ STL set/multset

 本文转自: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 
#include 
#include 
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 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 
#include 
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)中

你可能感兴趣的:(stl,set)