C++ STL 之 set 和 pair

Posted duxie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ STL 之 set 和 pair相关的知识,希望对你有一定的参考价值。

set/multiset 的特性是所有元素会根据元素的值自动进行排序。set 是以 RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好。set 容器中不允许重复元
素,multiset 允许重复元素。
我们可以通过 set 的迭代器改变元素的值吗?
答: 不行,因为 set 集合是根据元素值进行排序,关系到 set 的排序规则,如果任意改变 set 的元素值,会严重破坏 set 组织。
#include <iostream>
#include <set>
#include <list>
#include <string>
using namespace std;

void PrintSet(set<int>& s)
{
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

class mycompare
{
public:
    bool operator()(int v1, int v2)
    {
        return v1 > v2;
    }
};

// set初始化
// set<T> st;//set 默认构造函数:
// mulitset<T> mst; //multiset 默认构造函数:
// set(const set &st);//拷贝构造函数
void test01()
{
    set<int> s1; // 自动进行排序, 默认从小到大
    s1.insert(7);
    s1.insert(2);
    s1.insert(4);
    s1.insert(5);
    s1.insert(1);
    PrintSet(s1);
    // 赋值操作
    // set& operator=(const set &st);//重载等号操作符
    // swap(st);//交换两个集合容器
    set<int> s2;
    s2 = s1;
    PrintSet(s2);
    // 删除操作
    // insert(elem);//在容器中插入元素。
    // clear();//清除所有元素
    // erase(pos);//删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
    // erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    // erase(elem);//删除容器中值为 elem 的元素。
    s1.erase(s1.begin());
    s1.erase(7);
    PrintSet(s1);
    cout << "----------------------" << endl;
}

// set查找
// find(key);//查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 map.end();
// lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。
// upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。
// equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。
void test02()
{
    set<int> s1;
    s1.insert(7);
    s1.insert(2);
    s1.insert(4);
    s1.insert(5);
    s1.insert(1);
    set<int>::iterator ret = s1.find(14);
    if (ret == s1.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "ret: " << *ret << endl;
    }
    // 找第一个大于key的值
    ret = s1.upper_bound(2);
    if (ret == s1.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "ret: " << *ret << endl;
    }
    // equal_range 返回Lower_bound 和 upper_bound值
    pair<set<int>::iterator, set<int>::iterator> myret = s1.equal_range(2);
    if (myret.first == s1.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "myret: " << *(myret.first) << endl;
     }
    if (myret.second == s1.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "myret: " << *(myret.second) << endl;
    }
    cout << "----------------" << endl;
}

class Person
{
public:
    Person(int age, int id) :id(id), age(age){}
public:
    int id;
    int age;
};

class mycompare2
{
public:
    bool operator()(Person p1, Person p2)
    {
        if (p1.id == p2.id)
        {
            return p1.age > p2.age;
        }
        else
        {
            p1.id > p2.id;
        }
    }
};

void test03()
{
    set<Person, mycompare2> sp;
    Person p1(10, 20), p2(20, 20), p3(50, 60);
    sp.insert(p1);
    sp.insert(p2);
    sp.insert(p3);
    Person p4(10, 30);
    for (set<Person, mycompare2>::iterator it = sp.begin(); it != sp.end(); it++)
    {
        cout << (*it).age << "  " << (*it).id << endl;
    }
    set<Person, mycompare2>::iterator ret = sp.find(p4);
    if (ret == sp.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "找到:" << (*ret).id << " " << (*ret).age << endl;
    }
}

// 对组

void test04()
{
    // 构造方法
    pair<int, int> pair1(10, 20);
    cout << pair1.first << " " << pair1.second << endl;
    pair<int, string> pair2 = make_pair(10, "aaaaa");
    cout << pair2.first << " " << pair2.second << endl;
    pair<int, string> pair3 = pair2;
}

int main()
{
    test01();
    test02();
    test03();
    test04();
    getchar();
    return 0;
}

 

以上是关于C++ STL 之 set 和 pair的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL之tuple详解

C++ STL之tuple详解

C++ STL之set详解

C++ STL之set详解

STL库之集合基本使用方法

C++从青铜到王者第二十篇:STL之setmapmultisetmultimap的初识