(1)set
特点
1.set作为一个容器是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据;
2.在set中每个元素的值都是唯一;
(所以他可以去重)
3.而且系统能根据元素的值自动进行排序;
用法
begin() 返回set容器第一个元素的迭代器
end() 返回一个指向当前set末尾元素的下一位置的迭代器
clear() 删除set容器中的所有元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素的最大个数
size() 返回当前set容器中元素个数
erase() 删除特定的值
//后面会详细说的
用 #include <set>
调用
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
int main()
{
set<int>s;//定义
s.insert(1);//插入
s.insert(2);
s.insert(3);
s.insert(1);
cout<<"set的size值为:"<<s.size()<<endl;
cout<<"set的maxsize的值为:"<<s.max_size()<<endl;
cout<<"set中的第一个元素是:"<<*s.begin()<<endl;
cout<<"set中的最后一个元素是:"<<*s.end()<<endl;
s.clear();//清空容器
if(s.empty())
{
cout<<"set 为空 !!!"<<endl;
}
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
return 0;
}
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int>s;
s.insert(3);
s.insert(1);
s.insert(2);
s.insert(1);
set<int>::iterator it; //声明
for(it=s.begin();it!=s.end();it++) //使用迭代器进行遍历
{
printf("%d\n",*it);
}
return 0;
}
//set的两个特点有序和不重复
count()用来查找set中某个键值出现的次数,这个函数在set中不是很实用,因为一个键值在set中只可能出现0次或1次,这样就变成了判断某一键值是否在set中出现过了。
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;
return 0;
}
erase(iterator) 删除定位器iterator指向的值
erase(first,second) 删除定位器first和second之间的值
erase(key_value) 删除键值key_value的值
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
set<int>::iterator iter;
set<int>::iterator first;
set<int>::iterator second;
for(int i = 1 ; i <= 10 ; ++i)
s.insert(i);
s.erase(s.begin());//第一种删除
first = s.begin();
second = s.begin();
second++;
second++;
s.erase(first,second);//第二种删除
s.erase(8);//第三种删除
cout<<"删除后 set 中元素是 :";
for(iter = s.begin() ; iter != s.end() ; ++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}
find() 返回给定值,值的定位器,如果没有找到则返回end()
#include <iostream>
#include <set>
using namespace std;
int main()
{
int a[]={1,2,3};
set <int> s(a,a+3);
set <int> ::iterator iter;
if((iter=s.find(3))!=s.end())
{
cout<<*iter<<endl;
}
return 0;
}
insert(key_value); 将key_value插入到set中
insert(first,second); 将定位器first到second之间的元素插入到set中
#include <iostream>
#include <set>
using namespace std;
int main()
{
int a[]={1,2,3};
set<int>s;
set<int>::iterator iter;
s.insert(a,a+3);
for(iter=s.begin();iter!=s.end();++iter)
cout<<*iter<<" ";
cout<<endl;
s.insert(5);
for(iter=s.begin();iter!=s.end();++iter)
cout<<*iter<<" ";
return 0;
}
lower_bound(key_value) 返回第一个大于等于key_value的定位器
upper_bound(key_value) 返回最后一个大于等于key_value的定位器
//在不存在的情况下返回容器的end()
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
s.insert(1);
s.insert(3);
s.insert(4);
cout<<*s.lower_bound(2)<<endl;
cout<<*s.lower_bound(3)<<endl;
cout<<*s.upper_bound(3)<<endl;
return 0;
}
自定义比较函数
//从ppt上弄过来的
例子:
第一个模版:
struct People
{
string name;
int age;
bool operator <(const People p) const //运算符重载
{
return age<p.age; //按照年龄由小到大进行排序
}
};
第二个模版
struct People
{
string name;
int age;
friend bool operator <(People p,People q) //运算符重载
{
return p.age<q.age; //按照年龄由小到大进行排序
}
};
要一个完整代码
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
struct People
{
string name;
int age;
friend bool operator <(People p,People q) //运算符重载
{
return p.age<q.age; //按照年龄由小到大进行排序
}
};
int main()
{
set<People>s;
s.insert((People){"张颜齐",21});
s.insert((People){"周震南",19});
s.insert((People){"王嘉尔",25});
set<People>::iterator it;
for(it=s.begin();it!=s.end();it++) //使用迭代器进行遍历
{
printf("姓名:%s 年龄:%d\n",(*it).name.c_str(),(*it).age);
}
return 0;
}