STL:set的API

3 篇文章 0 订阅

目录

set 构造、赋值、插入、删除

set 查找操作


set是一种关联式容器,特性如下:

  • set以RBTree作为底层容器
  • 不允许出现键值重复
  • set容器只提供 insert()方法,因为它自动进行排序
  • 不能通过迭代器来改变set的值,

可以通过set是迭代器改变元素的值吗??

不可以改变,如果非要改变,删除后再添加。

       如果set中允许修改键值的话,那么首先需要删除该键,然后调节平衡,在插入修改后的键值,再调节平衡,这样严重破坏了set的结构,导致iterator失效,不知道应该指向之前的位置,还是指向改变后的位置。STL中将set的迭代器设置成const,不允许修改迭代器的值。

set 构造、赋值、插入、删除

  • set构造函数

set<T>st; //set默认构造函数

set(const set &st);//拷贝构造函数

  • set赋值操作

set& operator=(const set &st);// 等号运算符的重载

swap(st);// 交换两个容器

  • set大小操作

size();//返回容器中元素的数目

empty();//判断容器是否为空

  • ser插入和删除操作

insert(elem);//在容器中插入元素

clear();//清除所有元素

erase(pos);//删除迭代器所指的元素,返回下一个元素的迭代器

erase(beg,end);//删除区间所有元素,返回下一个元素的迭代器

erase(elem);/删除容器中值为 elem的元素 

操作代码: 

#include <algorithm>
#include <iostream>
#include<set>

using namespace std;

void Print(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it <<" ";
	}

	cout << endl;
}

void test01()
{
	//set容器初始化
	set<int> s1;  //自动进行排序,默认从小到大
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);

	Print(s1);//1 2 4  5 7

	set<int> s2;
	s2 = s1;//赋值

	//删除元素
	s1.erase(s1.begin());//erase()参数为 迭代器
	Print(s1); //2 4 5 7

	s1.erase(7);
	Print(s1);// 2 4 5

}
int main()
{
	test01();  
	return 0;
}

 打印结果:

set 查找操作

  • find(key):查找键key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
  •  lower_bound(keyElem):返回第一个key>=keyElem元素的迭代器。
  • upper_bound(keyElem):返回第一个key>keyElem元素的迭代器。
  • equal_range(keyElem):返回容器中ley与keyElemx相等的上下限的两个迭代器,即equal_range()将lower_bound()和upper_bound()的  返回值做个一个pair返回。

操作代码: 

#include <algorithm>
#include <iostream>
#include<set>

using namespace std;
//set的查找
void test02()
{
	set<int> s1;
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);

	set<int>::iterator ret=s1.find(14);
	if (ret == s1.end())
	{
		cout << "没有找到!" << endl;
	}
	else
	{
		cout << "ret:" << *ret << endl;
	}

	ret=s1.lower_bound(2);//找到第一个>=
	if (ret == s1.end())
	{
		cout << "没有找到!" << endl;
	}
	else
	{
		cout << "ret:" << *ret << endl;
	}

	ret = s1.upper_bound(2);//找到第一个>
	if (ret == s1.end())
	{
		cout << "没有找到!" << endl;
	}
	else
	{
		cout << "ret:" << *ret << endl;
	}

	//equal_range返回lower_bound和upper_bound
	pair<set<int>::const_iterator, set<int>::const_iterator> myret=s1.equal_range(2);
	if (myret.first == s1.end())
	{
		cout << "没有找到!" << endl;
	}
	else
	{
		cout << "myret:" << *(myret.first) << endl;
	}

	if (myret.second == s1.end())
	{
		cout << "没有找到!" << endl;
	}
	else
	{
		cout << "myret:" << *(myret.second) << endl;
	}

}

int main()
{
	//test01();  
	test02();
	return 0;
}

 打印结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值