C++ STL set

set/multiset
set:所有元素都会在插入时自动被排序;
set/multiset属于关联式容器,底层结构是用二叉树实现;

size(); //set容器的大小
empty(); //set容器是否为空
swap(); //交换两个容器

set函数
1.insert(elem); //set容器中插入元素
2.clear(); //清除set容器中所有元素
3.erase(pos); //删除pos迭代器所指元素
,返回下一个元素的迭代器
4.erase(begin, end); //删除beg,end区间
的所有元素,返回下一个元素的迭代器
5.erase(elem); //删除容器中值为elem的元素

find(elem);//查找容器中的元素是否存在
如果存在返回所在迭代器,不存在返回set.end()

count(elem);//返回指定元素个数
set和multiset区别
set不可插入重复值,multiset可以
set插入数据会返回插入结果,标识插入是否成功
multiset不会检测插入结果,所以可以插入重复数据

对组创建,frist、second获取对组元素值
pair<type, type> p(value, value);
pair<type, type> p=make_pair(value, value);

#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
#include <list>
#include <set>
using namespace std;

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

}

void printmultiset(const multiset<int> &st)
{
	for (multiset<int>::const_iterator it=st.begin(); it != st.end(); it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	
}
//set
void test1()
{
	set<int> st;
	//set容器只有insert函数添加元素方法
	st.insert(20);
	st.insert(50);
	st.insert(30);
	pair<set<int>::iterator, bool> ret = st.insert(20);	//插入重复值,会失败
	if (ret.second)
	{
		cout<<"插入数据成功"<<endl;
	}
	else
	{
		cout<<"插入失败"<<endl;
	}
	st.insert(40);
	
	printset(st);//发现自动排序并去重

	set<int> st1(st);
	//删除set容器中指定的元素值
	st1.erase(20);
	printset(st1);

	set<int> st2=st1;
	printset(st2);

}

//multiset
void test2()
{
	multiset<int> st;
	//set容器只有insert函数添加元素方法
	st.insert(20);
	st.insert(50);
	st.insert(30);
	st.insert(20);
	st.insert(40);
	
	printmultiset(st);//发现自动排序但是并不去重复元素
	
	multiset<int> st1(st);
	
	//删除set容器中指定的元素值
	st1.erase(20);
	printmultiset(st1);		//删除时,相同的元素值都被删除吊
	
	multiset<int> st2=st1;
	printmultiset(st2);
	
}

//size统计容器元素个数
void test3()
{
	set<int> st;
	st.insert(20);
	st.insert(50);
	st.insert(30);
	st.insert(20);
	st.insert(40);

	cout<<"size:"<<st.size()<<endl;
	
	set<int> st1;
	st1.insert(90);
	st1.insert(100);

	cout<<"size:"<<st1.size()<<endl;
	st.swap(st1);		//交换两个容器

	printset(st);
	printset(st1);
}

//rease删除重载函数和clear清除函数
void test4()
{
	set<int> st;
	st.insert(20);
	st.insert(50);
	st.insert(30);
	st.insert(20);
	st.insert(40);
	

	//erase删除区间
	set<int> st1(st);
	st1.erase(st1.begin(), st1.end());
	printset(st1);

	//清除set容器中的所有元素
	set<int> st2=st;
	st2.clear();
	printset(st1);
}
//find寻找元素和count统计函数
void test5()
{
	set<int> st;
	st.insert(20);
	st.insert(50);
	st.insert(30);
	st.insert(20);
	st.insert(40);

	//只要元素不存在,就返回end迭代器
	set<int>::iterator pos = st.find(20);
	if (pos != st.end())
	{
		cout<<"找到:"<<*pos<<endl;
	}
	else
	{
		cout<<"未找到"<<endl;
	}

	//针对set容器而言,统计结果要么是0或1(set容器会对元素去重)
	cout<<"元素个数:"<<st.count(50)<<endl;
}
//pair对组
void test6()
{
	pair<string, int> p("zhangsan", 20);
	cout<<"name:"<<p.first<<" "<<"age:"<<p.second<<endl;

	pair<string, int> p1 = make_pair("lisi", 50);
	cout<<"name:"<<p1.first<<" "<<"age:"<<p1.second<<endl;

}

//set容器自定义数据类型排序
class Person
{
public:
	Person(string name, int age):m_name(name), m_age(age){}
	string m_name;
	int m_age;

};

class ComparePerson
{
public:
	bool operator()(const Person &p1, const Person &p2)
	{
		return p1.m_age<p2.m_age;
	}
};

void test7()
{
	set<Person, ComparePerson> st;
	Person p1("刘备", 40);
	Person p2("关羽", 38);
	Person p3("张飞", 36);
	Person p4("赵云", 30);
	
	st.insert(p1);
	st.insert(p2);
	st.insert(p3);
	st.insert(p4);

	for (set<Person, ComparePerson>::iterator it=st.begin(); it!=st.end(); it++)
	{
		cout<<"name:"<<it->m_name<<" "<<"age:"<<it->m_age<<endl;	
	}

}
int main()
{
	//test1();
	//test2();
	
	test3();
	
	return 0;
}


### C++ STL `set` 容器的用法、特性和示例 #### 特性概述 `set` 是 C++ 标准模板库(STL)中的关联容器之一,用于存储唯一键值的数据集合。该容器内部通常基于自平衡二叉树实现,这使得插入、删除和查找操作具有对数时间复杂度 O(log n)[^1]。 - **有序性**:`set` 中的元素按照严格弱序排列,默认情况下会升序保存数据。 - **唯一性**:不允许存在重复的关键字,即同一个数值只能出现一次。 - **自动排序**:每当有新元素加入时,它会被放置到合适的位置以保持整个序列处于已排序状态。 #### 基本语法与定义 要使用 `set` 需要包含 `<set>` 头文件: ```cpp #include <set> ``` 创建一个简单的整型 `set` 可以这样写: ```cpp std::set<int> mySet; ``` 如果想要改变默认比较方式可以传递第二个参数给模板实例化过程,比如降序排列: ```cpp struct DescendingOrder { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; std::set<int, DescendingOrder> descendingInts; ``` #### 插入元素 向 `set` 添加成员非常直观: ```cpp mySet.insert(42); mySet.emplace(7); // 更高效的原位构造方法 auto resultPair = mySet.insert_or_assign(mySet.end(), 8); // 如果已经存在则更新现有条目 ``` #### 查找元素 可以通过迭代器访问特定位置上的项目;也可以利用内置函数快速定位某个具体值得索引处对象: ```cpp if (mySet.find(42) != mySet.end()) { std::cout << "Found!" << '\n'; } // 或者更简洁的方式 bool contains(const T& value) : mySet.count(value) > 0; ``` #### 删除元素 移除指定项同样简单明了: ```cpp size_t erasedCount = mySet.erase(42); // 返回被删掉的数量 auto pos = mySet.find(7); if(pos!=mySet.end()){ mySet.erase(pos); // 使用找到的具体位置作为参数 } ``` #### 迭代遍历 最后但并非最不重要的是,通过循环结构逐一遍历所有记录也十分容易做到: ```cpp for(auto elem : mySet){ std::cout<<elem<<"\t"; } // 或者采用传统风格 for(std::set<int>::iterator itr=mySet.begin();itr!=mySet.end();++itr){ std::cout<<*itr<<"\t"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值