C++ stl 学习5-- set

<set> 头文件包含set和multiset

set

特点:1)值唯一,无法更改且有序,默认是 < 号排序的

           2)查找元素时比unordered_set慢  set containers are generally slower than unordered_set containers to access individual elements by their key, but they allow the direct iteration on subsets based on their order

 

 

insert()  //  插入元素, 两种返回值形式下iterator总是指向该元素,当返回类型是pair<set<int>::iterator, bool> 时,且容器有该元素时bool值为false

有以下4种形式

1)

pair<iterator,bool> insert (const value_type& val);
pair<iterator,bool> insert (value_type&& val);
2)
iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, value_type&& val);
3)
template <class InputIterator> void insert (InputIterator first, InputIterator last);

4)
void insert (initializer_list<value_type> il);

erase()   // 删除元素,返回删除元素末尾的后一个元素,如果是删除值的话则返回删除的个数 For the value-based version, the function returns the number of elements erased.

iterator erase (const_iterator position);
size_type erase (const value_type& val); // 感觉有点莫名奇妙,set里面没有重复的,这里却返回删除元素的个数,感觉永远是1
iterator erase (const_iterator first, const_iterator last);

emplace()   // 根据排序算法将元素在对应地方生成,只调用构造函数,iterator指向参数的那个值,bool为true表示有元素生成(即set里面没有这个要构造的元素)

template <class... Args> pair<iterator,bool> emplace (Args&&... args);

emplace_hint()  //  根据提示生成元素,与emplace的区别是有了提示只后更快

template <class... Args> iterator emplace_hint (const_iterator position, Args&&... args);

key_comp()  // 返回set的比较函数或者对象

Returns a copy of the comparison object used by the container

key_compare key_comp() const

value_comp()   // // 返回set的比较函数或者对象

Returns a copy of the comparison object used by the container

value_compare value_comp() const;

count()  // 计算某个元素的个数

lower_bound()  // 返回容器中大于等于该元素的最小值的迭代器,即在容器中寻找一个最小的元素,满足该元素大于等于value

iterator lower_bound (const value_type& val);
const_iterator lower_bound (const value_type& val) const;

upper_bound()   // 返回容器中大于该元素值的最小的元素,在容器中寻找一个最小的元素,该元素的值大于给定的值

iterator upper_bound (const value_type& val);
const_iterator upper_bound (const value_type& val) const;

equal_range() // 返回值类型是pair<set<T>::iterator, set<T>::iterator> 分别为lower_bound 和 upper_bound

pair<const_iterator,const_iterator> equal_range (const value_type& val) const;
pair<iterator,iterator> equal_range (const value_type& val);

 

#include <iostream>
#include <set>
#include <functional>
using namespace std;

int main()
{
    set<int>  s {1, 3, 5, 7, 10};
    set<int>  arr{2, 4, 6};
    pair<set<int>::const_iterator, bool> itor = s.insert(3);  //  itor.first指向3,itor.second 值为false
    s.insert(begin(arr), end(arr));  // 1 2 3 4 5 6 7 10

    cout << s.erase(2) << endl;    // 返回值1
    auto new_itor = s.erase(itor.first);   // 移除itor.first指向的元素3
    cout << *new_itor << endl;   // 4

    cout << *s.emplace(9).first << endl;   // 返回pair的first是指向9的迭代器
    s.emplace_hint(arr.end(), 0);   // hint 瞎填都行


    set<int>  ok{1,2,3,5,6,7,8,9};
    auto ii = ok.lower_bound(6);    // ii指向6   6 >= 6
    auto jj = ok.lower_bound(4);    // jj指向5   5 >= 4
    auto kk = ok.upper_bound(4);    // kk指向5   5 > 4
    auto ll = ok.upper_bound(3);    // ll指向5   5 > 3
    auto oo = ok.equal_range(3);    // oo.first指向3 ,oo.last指向5

    function<bool(int,int)> func  = [](int x, int y) {return abs(x) > abs(y);};
    std::set<int, function<bool(int,int)>> myset(func);
    std::set<int, function<bool(int,int)>>::key_compare my_key_comp = myset.key_comp();
    std::set<int, function<bool(int,int)>>::value_compare my_value_comp = myset.value_comp();
    myset = {-3,-2,1,0,2,4,6};   // 按照绝对值排序6 4 -3 -2 1 0  (2没有了)

    cout << my_key_comp(-2,1) << endl;   // 返回1   
    cout << my_value_comp(-2,1) << endl; // 返回1
    return 0;
}

 

multiset

multiset的成员函数和set一模一样

insert()  // 当插入的元素是容器中相同的值时,返回的迭代器是最后一个该元素,比如 1  2  2  2  3,然后insert(2), 那么返回的itor是指向最后一个2,下一个元素是3

erase()删除元素的时候如果是值,则把所有相同的都删掉,如果是position,则返回迭代器是删除元素的后一个

1 1  1  2  2 3, erase(1)会删除所有的1, erase(begin()) 会删除一个1,然后返回的迭代器指向第2个1

find()  // 没找到返回end,找到返回第一个找到的元素  1  2  3  3   3  3  3; find(3)找到的是2后面那个3

lower_bound()  // 返回容器中大于等于该元素的最小值的迭代器,即在容器中寻找一个最小的元素,满足该元素大于等于value 

1  1  1   2   2   2   2   4  4  4  4  lower_bound(2)  返回迭代器指向第一个2, 前面指向1 

upper_bound()  // 返回容器中大于该元素的最小值的迭代器,即在容器中寻找一个最小的元素,满足该元素大于value 

1  1  1   2   2   2   2   4  4  4  4  lower_bound(2)  返回迭代器指向第一个4, 前面指向2 

 

 

 

posted @ 2021-02-14 14:05  goodluck14  阅读(69)  评论(0)    收藏  举报