C++ set与multiset

本文深入解析C++ STL中的set与multiset容器的使用方法,包括基本概念、区别、创建方式、比较函数自定义及常用操作。通过实例展示了如何使用自定义比较函数实现元素排序,并详细说明了set的构造方法与特性。
C++ STL set和multiset的使用
1,set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同
 创建 multiset<ss> base;
 删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除
 base.count( a ):set能返回0或者1,multiset是有多少个返回多少个.
 Set和multiset都是引用<set>头文件,复杂度都是logn
2,Set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即大小的比较关系,比如 整数可以用<比较.
3,自定义比较函数;
 include<set>
 typedef struct
 { 定义类型 }
 ss(类型名);
 struct cmp
 {
 bool operator()( const int &a, const int &b ) const
 { 定义比较关系<}
 };
 (运算符重载,重载<)
 set<ss> base; ( 创建一个元素类型是ss,名字是base的set )
 注:定义了<,==和>以及>=,<=就都确定了,STL的比较关系都是用<来确定的,所以必须通 过定义< --“严格弱小于”来确定比较关
4,set的基本操作:
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true
end() 返回指向最后一个元素的迭代器
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
5,自定义比较函数:
For example:
#include<iostream>
#include<set>
using namespace std;
typedef struct {
int a,b;
char s;
}newtype;
struct compare //there is no ().
{
bool operator()(const newtype &a, const newtype &b) const
{
return a.s<b.s;
}
};//the “; ” is here;
set<newtype,compare>element;
int main()
{
newtype a,b,c,d,t;
a.a=1; a.s='b';
b.a=2; b.s='c';
c.a=4; c.s='d';
d.a=3; d.s='a';
element.insert(a);
element.insert(b);
element.insert(c);
element.insert(d);
set<newtype,compare>::iterator it;
for(it=element.begin(); it!=element.end();it++)
cout<<(*it).a<<" ";
cout<<endl;
for(it=element.begin(); it!=element.end();it++)
cout<<(*it).s<<" ";
}
element自动排序是按照char s的大小排序的;
6.其他的set构造方法;
#include <iostream>
#include <set>
using namespace std;
bool fncomp (int lhs, int rhs) {return lhs<rhs;}
struct classcomp {
 bool operator() (const int& lhs, const int& rhs) const
 {return lhs<rhs;}
};
int main ()
{
 set<int> first; // empty set of ints
 int myints[]= {10,20,30,40,50};
 set<int> second (myints,myints+5); // pointers used as iterators
 set<int> third (second); // a copy of second
 set<int> fourth (second.begin(), second.end()); // iterator ctor.
 set<int,classcomp> fifth; // class as Compare
 bool(*fn_pt)(int,int) = fncomp;
 set<int,bool(*)(int,int)> sixth (fn_pt); // function pointer as Compare
 return 0;
}
C++中,`set` 和 `multiset` 都属于关联容器,存储的元素都会根据元素的值自动进行排序。但两者存在以下区别: ### 元素唯一性 - `set` 容器中不允许有重复的元素,当插入重复元素时,插入操作会失败。例如以下代码: ```cpp #include <iostream> #include <set> using namespace std; void test01() { set<int> s; pair<set<int>::iterator, bool> ret = s.insert(10); if (ret.second) { cout << "第一次插入成功" << endl; } else { cout << "第一次插入失败" << endl; } ret = s.insert(10); if (ret.second) { cout << "第二次插入成功" << endl; } else { cout << "第二次插入失败" << endl; } } int main() { test01(); return 0; } ``` 该代码展示了 `set` 插入重复元素时,第二次插入会失败[^1]。 - `multiset` 容器允许有重复的元素,插入重复元素会成功。如下代码: ```cpp #include <iostream> #include <set> using namespace std; void testMultiset() { multiset<int> ms; ms.insert(10); ms.insert(10); ms.insert(10); ms.insert(10); for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) { cout << *it << " "; } cout << endl; } int main() { testMultiset(); return 0; } ``` 该代码展示了 `multiset` 可以多次插入相同元素,且能正常存储并遍历输出[^1]。 ### 容器大小 由于 `set` 不允许重复元素,而 `multiset` 允许,所以对于包含重复元素的初始化序列,两者的大小可能不同。例如: ```cpp #include <string> #include <iostream> #include <set> #include <vector> using namespace std; int main() { vector<int> ivec; for(int i = 0; i!= 10;++i) { ivec.push_back(i); ivec.push_back(i); } set<int> iset(ivec.begin(),ivec.end()); multiset<int> miset(ivec.begin(),ivec.end()); cout << iset.size() << endl; cout << miset.size() << endl; cout << ivec.size() << endl; return 0; } ``` 此代码中,`iset` 的大小为 10,`miset` 的大小为 20,因为 `iset` 会去重,而 `miset` 保留所有元素[^2]。 ### 插入返回值 - `set` 的 `insert` 方法返回一个 `pair`,其中 `pair` 的 `second` 成员是一个布尔值,表示插入是否成功。 - `multiset` 的 `insert` 方法返回一个迭代器,指向新插入元素的位置,因为 `multiset` 插入总是成功,所以不需要返回布尔值表示插入结果。 ### 查找元素 - 在 `set` 中查找元素,若找到,返回指向该元素的迭代器;若未找到,返回 `end()` 迭代器。 - 在 `multiset` 中查找元素,若找到,返回指向该元素的迭代器;由于可能存在多个相同元素,`multiset` 还提供了 `count` 方法用于统计某个元素的出现次数。 ### 元素删除 - 在 `set` 中删除元素,若元素存在则删除并返回 1,若不存在则返回 0。 - 在 `multiset` 中删除元素,会删除所有指定值相等的元素,并返回被删除元素的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值