美文网首页
c++ set和pair

c++ set和pair

作者: arkliu | 来源:发表于2022-11-30 08:04 被阅读0次

    set常用api

    begin() 返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    end()   返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    rbegin()    返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
    rend()  返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
    cbegin()    和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。
    cend()  和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。
    crbegin()   和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。
    crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。
    find(val)   在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    lower_bound(val)    返回一个指向当前 set 容器中第一个大于或等于 val 的元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    upper_bound(val)    返回一个指向当前 set 容器中第一个大于 val 的元素的迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    equal_range(val)    该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的值为 val 的元素(set 容器中各个元素是唯一的,因此该范围最多包含一个元素)。
    empty() 若容器为空,则返回 true;否则 false。
    size()  返回当前 set 容器中存有元素的个数。
    max_size()  返回 set 容器所能容纳元素的最大个数,不同的操作系统,其返回值亦不相同。
    insert()    向 set 容器中插入元素。
    erase() 删除 set 容器中存储的元素。
    swap()  交换 2 个 set 容器中存储的所有元素。这意味着,操作的 2 个 set 容器的类型必须相同。
    clear() 清空 set 容器中所有的元素,即令 set 容器的 size() 为 0。
    emplace()   在当前 set 容器中的指定位置直接构造新元素。其效果和 insert() 一样,但效率更高。
    emplace_hint()  在本质上和 emplace() 在 set 容器中构造新元素的方式是一样的,不同之处在于,使用者必须为该方法提供一个指示新元素生成位置的迭代器,并作为该方法的第一个参数。
    count(val)  在当前 set 容器中,查找值为 val 的元素的个数,并返回。注意,由于 set 容器中各元素的值是唯一的,因此该函数的返回值最大为 1。
    

    set容器初始化

    #include <set>
    using namespace std;
    
    // set容器初始化
    void test01() {
        set<int>s1; // 自动进行排序,默认从小到大
        s1.insert(4);
        s1.insert(8);
        s1.insert(5);
        s1.insert(2);
        s1.insert(7);
    
        for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
        {
            cout << *it << "  ";
        }
        cout << endl;
        std::set<std::string> s2{"first",
                                "second",
                                "third"};
        std::set<std::string> s3 = s2;
        
        s1.erase(s1.begin());// 头删
        s1.erase(7); // 根据值进行删除
    }
    
    在这里插入图片描述

    可以看到set默认对内部元素进行了排序

    set查找

    void test02() {
        set<int>s1;
        s1.insert(4);
        s1.insert(8);
        s1.insert(5);
        s1.insert(2);
        s1.insert(7);
    
        set<int>::iterator ret = s1.find(4);
        if (ret == s1.end())
        {
            cout << "没有找到..." << endl;
        } else {
            cout << *ret << endl;
        }
        
        // 找到第一个大于等于key的元素
        ret = s1.lower_bound(2);
        if (ret == s1.end())
        {
            cout << "没有找到..." << endl;
        } else {
            cout << *ret << endl;
        }
    
        // 找到第一个大于key的迭代器
        ret = s1.upper_bound(2);
        if (ret == s1.end())
        {
            cout << "没有找到..." << endl;
        } else {
            cout << *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.first << endl;
        }
        
        if (myret.second == s1.end())
        {
            cout << "没有找到..." << endl;
        } else {
            cout << *myret.second << endl;
        } 
    }
    

    pair的基本操作

    void test02() {
        pair<string, int> pair1("name", 22);
        cout << pair1.first << "  "<< pair1.second << endl;
    
        pair<string, int> pair2 = make_pair("hello", 33);
        cout << pair2.first << "  "<< pair2.second << endl;
    
        pair<string, int> pair3 = pair1;
        cout << pair3.first << "  "<< pair3.second << endl;
    }
    

    map的四种插入数据方式

    #include<map>
    
    map<int, int> mymap;
    // 插入数据 pair
    pair<map<int, int>::iterator, bool> ret = mymap.insert(pair<int, int>(1, 111));
    if (ret.second)
    {
        cout << "插入成功。。。" << endl;
    }else{
        cout << "插入失败。。。" << endl;
    }
    ret = mymap.insert(pair<int, int>(1, 111));
    if (ret.second)
    {
        cout << "插入成功。。。" << endl;
    } else{
        cout << "插入失败。。。" << endl;
    }
    mymap.insert(make_pair(2, 222));
    mymap.insert(map<int, int>::value_type(3, 333));
    mymap[4] = 444;
    
    // 如果通过[]方式去访问map中一个不存在的key,
    //那么map会将这个key插入到map中,并且给这个value一个默认值
    cout << "mymap[44] = "<<mymap[44] << endl;
    //打印
    for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
    {
        // *it取出来的是一个pair
        cout << " key :" << it->first << "  value: "<<it->second << endl;
    }
    

    相关文章

      网友评论

          本文标题:c++ set和pair

          本文链接:https://www.haomeiwen.com/subject/ueagxdtx.html