/*STL set集合*/
/*2015.05.24 11:29第一次整理*/
/* map和set的插入删除效率比用其他序列容器高——指针的变换*/
/*每次insert之后,以前保存的iterator不会失效——内存地址不变*/
/**/
/**/
#include <iostream>
#include <cstdio>
#include <set>
#include <string>
using namespace std;
typedef struct mycomp//基本元素排序函数
{
//自定义从大到小的比较函数,重载()操作符,默认从小到大
bool operator () (const int &a,const int & b)
{
return a > b;
}
}cmp;
typedef struct STUDENT
{
double score;
string name;
bool operator < (const STUDENT &a) const
//重载小于号,按从大到小顺序排列
{
if(score != a.score)
{
return score > a. score;
}
else
{
return name > a.name;
}
}
}Info;
int main()
{
set<int> s;
set<int>::iterator sIte;
///插入
s.insert(1);
//返回值 pair<set<int>::iterator,bool>,bool判断是否成功,
//迭代器为插入成功后的位置或者已经尊在的元素的位置
s.insert(3);
s.insert(7);
s.insert(5);
s.insert(3);//重复元素,不插入
for(sIte = s.begin(); sIte != s.end(); ++sIte) //中序遍历
{
cout << *sIte << endl;//迭代器本质就是一个指针
}
///反向遍历
set<int>::reverse_iterator sIter;
for(sIter = s.rbegin(); sIter != s.rend(); ++sIter)
{
cout << *sIter << endl;
}
///删除(set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等)
s.erase(3);//直接删除键值
set<int>::iterator first,second;
first = s.begin();
second = s.begin();
for(int i = 0;i < 2;i++)
{
second++;
}//迭代器不支持“+”与“+=”操作符
s.erase(second);
cout << " " << *second << endl;//输出还是7,但是集合里面已经没有7这个元素,地址没有变
s.erase(first,--second);//前闭后开的区间,且第二个参数必须是存在树结构中,否则first无法遍历到second位置
s.insert(first,--second);//不懂用法
for(sIter = s.rbegin(); sIter != s.rend(); ++sIter)
{
cout << *sIter << endl;
}//输出1、5
///查找
s.insert(1);
s.insert(3);
s.insert(7);
s.insert(5);
if(s.count(3))//计数函数,set中返回值只有0,1
{
cout << "find!count 值:" << s.count(3) <<endl;
}
else
{
cout << "do not find" << endl;
}
if((sIte = s.find(2)) == s.end())
{
cout << "do not find" << endl;
}
else
{
cout << "find :" << *sIte <<endl;
}
///定位器
//equal_range() 用法同map
//lower_bound(key_value) ,返回第一个大于等于key_value的定位器
//upper_bound(key_value),返回最后一个大于等于key_value的定位器
///判空、清空
if(s.empty())
{
cout << "empty!"<< endl;
}
else
{
cout << "not empty" << endl;
}
s.clear();
///求大小
cout << s.size() << endl;
cout << s.max_size() << endl;//返回set容器可能包含的元素最大个数
///简单元素自定义比较函数
set<int,cmp>mySet;
mySet.insert(1);
mySet.insert(3);
mySet.insert(7);
mySet.insert(5);
for(sIte = mySet.begin(); sIte != mySet.end(); ++sIte)
{
cout << *sIte << endl;
}//7,5,3,1
///结构体元素排序
set<Info> stu;
set<Info>::iterator sStuIte;
Info temp;
temp.name = "cainao";
temp.score = 80;
stu.insert(temp);
temp.name = "sabi";
temp.score = 85;
stu.insert(temp);
temp.name = "erhuo";
temp.score = 80;
stu.insert(temp);
for(sStuIte = stu.begin();sStuIte != stu.end();++sStuIte)
{
cout << (*sStuIte).name << " " << (*sStuIte).score << endl;
}
return 0;
}
STL set 整理
最新推荐文章于 2021-09-10 12:59:23 发布