c++ stl集合set介绍
c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。
1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素
2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)
先看看程序 |
#include <iostream>
#include <set>
#include <string>
using namespace std;
void print(set<int> &s) //遍历函数
{
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void print(set<int, greater<int>> &s) //倒序遍历
{
set<int, greater<int>>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
// set : 红黑树 平衡二叉树
// 内部数据不能重复,值唯一
// set内部数据默认是以从小到大排序的
// set 内部元素是无法修改的
void func1() //插入和删除
{
set<int> s;
s.insert(6);
s.insert(4);
s.insert(5);
s.insert(10);
s.insert(8);
print(s);
cout << s.size() << endl;
cout << "--------------------------" << endl;
s.erase(s.begin());
print(s);
cout << "--------------------------" << endl;
s.erase(10); // 通过值直接删除元素
print(s);
}
// set内部的排序
void func2()
{
// set<int> s; set<int, less<int>> s; <=== 默认形式
set<int,greater<int>> s;
s.insert(6);
s.insert(4);
s.insert(5);
s.insert(10);
s.insert(10);
s.insert(10);
s.insert(8);
print(s);
}
class Student //set保存自定义数据(一定要重载<,否则set无法排序)
{
public:
Student (int id, string name)
{
this->id = id;
this->name = name;
}
void print() const
{
printf ("id = %d, name = %s\n", id, name.c_str());
}
bool operator <(const Student &s) const
{
return (id < s.id);
// return (name < s.name);
}
//bool operator >(const Student &s) const
//{
// return (id > s.id);
// // return (name < s.name);
//}
private:
int id;
string name;
};
// set 内部需要比较大小
// 1、运算符重载 <
// 2、写一个函数对象
void func3()
{
Student s1(10, "小明10");
Student s2(2, "小明2");
Student s3(3, "小明3");
Student s4(7, "小明7");
Student s5(4, "小明4");
set<Student> s;
s.insert(s1);
s.insert(s2);
s.insert(s3);
s.insert(s4);
s.insert(s5);
set<Student>::iterator it = s.begin();
while (it != s.end())
{
it->print();
it++;
}
}
// set的返回值
void func4()
{
set<int> s;
s.insert(6);
s.insert(4);
s.insert(5);
s.insert(10);
s.insert(8);
print(s);
// pair 对组:两个数
// 第一个参数:迭代器,指向插入元素的迭代器
// 第二个元素:判断插入成功与否
pair<set<int>::iterator, bool> ret = s.insert(10);
if (ret.second)
cout << "插入成功,插入的元素:" << *ret.first << endl;
else
cout << "插入失败" << endl;
ret = s.insert(90);
if (ret.second)
cout << "插入成功,插入的元素:" << *ret.first << endl;
else
cout << "插入失败" << endl;
}
// multiset:内部元素允许重复
void func5()
{
multiset<int> s;
s.insert(6);
s.insert(4);
s.insert(5);
s.insert(10);
s.insert(4);
s.insert(4);
s.insert(4);
s.insert(4);
s.insert(8);
multiset<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
// 查找:返回值是第一个满足要求的迭代器,没有查找到,返回end()
it = s.find(15);
if (it != s.end())
cout << "找到:" << *it << endl;
else
cout <<"没找到" << endl;
// 返回值:指向第一个大于等于要查找的元素的迭代器
// it = s.lower_bound(8);
it = s.lower_bound(7);
if (it != s.end())
cout << "找到:" << *it << endl;
else
cout <<"没找到" << endl;
// 返回值:指向第一个大于要查找的元素的迭代器
it = s.upper_bound(8);
if (it != s.end())
cout << "找到:" << *it << endl;
else
cout <<"没找到" << endl;
// equal_range 等价于 lower_bound + upper_bound
// 返回值 第一个参数 等价于 lower_bound 返回值
// 返回值 第二个参数 等价于 upper_bound 返回值
pair<multiset<int>::iterator, multiset<int>::iterator> ret = s.equal_range(4);
multiset<int>::iterator it1 = ret.first;
multiset<int>::iterator it2 = ret.second;
while (it1 != it2)
{
cout << *it1 << endl;
it1++;
}
}
int main()
{
func5();
return 0;
}
set的各成员函数列表如下:
c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器
c++ stl容器set成员函数:clear()--清除所有元素
c++ stl容器set成员函数:count()--返回某个值元素的个数
c++ stl容器set成员函数:empty()--如果集合为空,返回true
c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器
c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器
c++ stl容器set成员函数:erase()--删除集合中的元素
c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器
c++ stl容器set成员函数:get_allocator()--返回集合的分配器
c++ stl容器set成员函数:insert()--在集合中插入元素
c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数
c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值
c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器
c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器
c++ stl容器set成员函数:size()--集合中元素的数目
c++ stl容器set成员函数:swap()--交换两个集合变量
c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器
c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数