五、c++笔记 set/ multiset容器

一、 set基本概念   

        所有元素都会在插入时自动被排序,set/multiset属于关联式容器,底层结构是用二叉树实现。  set和multiset区别:set不允许容器中有重复的元素,multiset允许容器中有重复的元素

二、set构造和赋值

        1、默认构造   set<类型> s;

        2、拷贝构造   set<类型>s2(s);

        3、set结果与插入顺序无关,最后结果都是有序的,所以没有头插和尾插,都是用insert

	set<int> s;	
	s.insert(10);
	s.insert(15);
	s.insert(7);	
	printset(s);
	cout << "--------" << endl;	
	set<int> s2(++s.begin(), s.end());
	printset(s2);
	cout << "--------" << endl;
	set<int>s3 = s;
	printset(s3);

  三、大小和交换

        1、容器大小size    

        2、容器交换swap

        3、容器是否为空  empty

        4、不允许重新指定容器大小,因为没有初始位置

	set<int> s;	
	s.insert(10);
	s.insert(15);
	s.insert(7);	
	printset(s);
	cout << "--------" << endl;	
	set<int> s2(++s.begin(), s.end());
	printset(s2);
	cout << "--------" << endl;
	set<int>s3 = s;
	printset(s3);
	cout <<"容器的大小: "<< s3.size() << endl;
	cout <<"容器是否为空: "<< s3.empty() << endl;
	s3.swap(s2);
	printset(s3);

四、插入和删除

        1、插入insert 

        没有头插和尾插的方法,插入位置由set决定。

        2、删除指定数据erase 参数可以为迭代器,也可以是具体数据

        3、清空clear

s3.erase(15);
printset(s3);
s2.erase(s2.find(15));
printset(s2);
s2.clear();
cout << s2.count(15) << endl;

五、查找和统计

        map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在,当然也可以使用find()方法判断键值是否存在。

        find()方法返回值是一个迭代器,成功返回迭代器指向要查找的元素,失败返回的迭代器指向end。count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素。

六、multiset与set区别

        1、multiset允许插入重复值

        2、set插入值后有返回值,为pair队组  例如pair<iterator,bool>a  a.first

set<int>s2;
pair<set<int>::iterator, bool> p = s2.insert(6);
cout << p.second << endl;

pair<string, int> aa = make_pair("zhangsan", 30);
pair<string, int> b ("王五", 30);
cout << "姓名:" << aa.first << " 年龄:" << aa.second << endl;

七、set容器自定义排序

        1、加入仿函数类 重写operator函数

        class Myoprator {
        public:
                    bool operator()( int v1, int v2) const {           //vs中必须加const
                              return v1 > v2;
                    }
        };

        2、set容器的类型中添加自定义的仿函数类。set<int,Myoprator> s;

         在整个声明set容器,使用set容器的过程中都要一样添加这个仿函数类。

        void printset(set<int, Myoprator>& lp) {
                    for (set<int,Myoprator>::const_iterator it = lp.begin(); it != lp.end(); it++)
                    {
                                cout << *it << " ";
                    }
                    cout << endl;
        }

class Myoprator {
public:
	bool operator()( int v1, int v2) const {           //vs中必须加const
		return v1 > v2;
	}
};
void printset(set<int, Myoprator>& lp) {
	for (set<int,Myoprator>::const_iterator it = lp.begin(); it != lp.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test() {
	set<int,Myoprator> s;
	s.insert(10);
	s.insert(15);
	s.insert(7);
	printset(s);	
}
int main() {
	test();
}

  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
multisetC++标准库中的一个容器,它是一个有序的集合,允许重复的元素存在。它在头文件<set>中定义。 multiset容器的用法如下: 1. 创建multiset对象: ```cpp std::multiset<int> mySet; ``` 2. 插入元素: 使用insert()函数向multiset中插入元素。由于multiset允许重复的元素存在,因此可以插入相同的元素。 ```cpp mySet.insert(10); mySet.insert(20); mySet.insert(10); ``` 3. 遍历multiset: 可以使用迭代器来遍历multiset中的元素。 ```cpp for(auto it = mySet.begin(); it != mySet.end(); ++it) { std::cout << *it << " "; } ``` 4. 查找元素: 使用find()函数可以查找multiset中的元素。如果找到了指定的元素,则返回指向该元素的迭代器;如果没找到,则返回end()迭代器。 ```cpp auto it = mySet.find(20); if(it != mySet.end()) { std::cout << "Found: " << *it << std::endl; } else { std::cout << "Not found" << std::endl; } ``` 5. 删除元素: 使用erase()函数可以删除multiset中的元素。可以删除指定值的元素,也可以删除指定位置的元素。 ```cpp mySet.erase(10); // 删除所有值为10的元素 auto it = mySet.find(20); if(it != mySet.end()) { mySet.erase(it); // 删除指定位置的元素 } ``` multiset容器的特点是它的元素会根据特定的排序规则进行自动排序,因此在插入和删除元素时会有一定的性能开销。但是它提供了高效的查找操作,适用于需要有序且允许重复元素的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值