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

浙公网安备 33010602011771号