c set endd前一个元素怎么表示

2288人阅读
set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference)
并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset
#include&set&
#include&iterator&
#include&iostream&
int main()
set&int&eg1;
eg1.insert(1);
eg1.insert(100);
eg1.insert(5);
eg1.insert(1);//元素1因为已经存在所以set中不会再次插入1
eg1.insert(10);
eg1.insert(9);
//遍历set,可以发现元素是有序的
set&int&::iterator set_iter=eg1.begin();
cout&&&Set named eg1:&&&
for(;set_iter!=eg1.end();set_iter++) cout&&*set_iter&&& &;
//使用size()函数可以获得当前元素个数
cout&&&Now there are &&&eg1.size()&&& elements in the set eg1&&&
if(eg1.find(200)==eg1.end())//find()函数可以查找元素是否存在
&& cout&&&200 isn't in the set eg1&&&
set&int&eg2;
for(int i=6;i&15;i++)
eg2.insert(i);
cout&&&Set named eg2:&&&
for(set_iter=eg2.begin();set_iter!=eg2.end();set_iter++)
&& cout&&*set_iter&&& &;
//获得两个set的并
set&int&eg3;
cout&&&Union:&;
set_union(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator&set&int& &(eg3,eg3.begin()));//注意第五个参数的形式
copy(eg3.begin(),eg3.end(),ostream_iterator&int&(cout,& &));
//获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下
eg3.clear();
set_intersection(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator&set&int& &(eg3,eg3.begin()));
cout&&&Intersection:&;
copy(eg3.begin(),eg3.end(),ostream_iterator&int&(cout,& &));
//获得两个set的差
eg3.clear();
set_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator&set&int& &(eg3,eg3.begin()));
cout&&&Difference:&;
copy(eg3.begin(),eg3.end(),ostream_iterator&int&(cout,& &));
//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B
&& eg3.clear();
&& set_symmetric_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator&set&int& &(eg3,eg3.begin()));
&& copy(eg3.begin(),eg3.end(),ostream_iterator&int&(cout,& &));
set会对元素进行排序,那么问题也就出现了排序的规则是怎样的呢?上面的示例代码我们发现对int型的元素可以自动判断大小顺序,但是对char*就不会自动用strcmp进行判断了,更别说是用户自定义的类型了,事实上set的标准形式是set&Key, Compare, Alloc&,
默认值
集合的关键字和值的类型
关键字比较函数,它的参数类型key参数指定的类型,如果第一个参数小于第二个参数则返回true,否则返回false
set的分配器,用于内部内存管理
下面给出一个关键字类型为char*的示例代码
#include&iostream&
#include&iterator&
#include&set&
struct ltstr
bool operator() (const char* s1, const char* s2) const
&& return strcmp(s1, s2) & 0;
int main()
const int N = 6;
const char* a[N] = {&isomer&, &ephemeral&, &prosaic&,&
&& &nugatory&, &artichoke&, &serif&};
const char* b[N] = {&flat&, &this&, &artichoke&,
&& &frigate&, &prosaic&, &isomer&};
set&const char*,ltstr& A(a, a + N);
set&const char*,ltstr& B(b, b + N);
set&const char*,ltstr& C;
cout && &Set A: &;
//copy(A.begin(), A.end(), ostream_iterator&const char*&(cout, & &));
set&const char*,ltstr&::
for(itr=A.begin();itr!=A.end();itr++) cout&&*itr&&& &;
cout && &Set B: &;
copy(B.begin(), B.end(), ostream_iterator&const char*&(cout, & &));&&&
cout && &Union: &;
set_union(A.begin(), A.end(), B.begin(), B.end(),
&&& ostream_iterator&const char*&(cout, & &),
&&& ltstr());&&&
cout && &Intersection: &;
set_intersection(A.begin(), A.end(), B.begin(),B.end(),ostream_iterator&const char*&(cout,& &),ltstr());
set_difference(A.begin(), A.end(), B.begin(), B.end(),inserter(C, C.begin()),ltstr());
cout && &Set C (difference of A and B): &;
copy(C.begin(), C.end(), ostream_iterator&const char*&(cout, & &));
其中的ltstr也可以这样定义
class ltstr
&&&&&&& public:
&&&&&&& bool operator() (const char* s1,const char*s2)const
&&&&&&&&&&&&&&& return strcmp(s1,s2)&0;
更加通用的应用方式那就是数据类型也是由用户自定义的类来替代,比较的函数自定义,甚至可以加上二级比较,比如首先按照总分数排序,对于分数相同的按照id排序,下面是示例代码
#include&set&
#include&iostream&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
struct compare
&&&&&&& bool operator()(const Entity& e1,const Entity& e2)const&& {
&&&&&&&&&&&&&&& if(e1.score&e2.score)
&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&& if(e1.score==e2.score)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(e1.id&e2.id)
&&&&&&&&&&&&&&&
int main()
&&&&&&& set&Entity,compare&s_
&&&&&&& Entity a,b,c;
&&&&&&& a.id=123;a.score=90;a.name=&bill&;
&&&&&&& b.id=121;b.score=85;b.name=&mary&;
&&&&&&& c.id=130;c.score=85;c.name=&jerry&;
&&&&&&& s_test.insert(a);s_test.insert(b);s_test.insert(c);
&&&&&&& set&Entity,compare&::
&&&&&&& cout&&&Score List(ordered by score):\n&;
&&&&&&& for(itr=s_test.begin();itr!=s_test.end();itr++)
&&&&&&&&&&&&&&& cout&&itr-&id&&&---&&&itr-&name&&&---&&&itr-&score&&
&&&&&&& return 0;
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63543次
排名:千里之外
原创:27篇
转载:35篇
(4)(4)(5)(18)(4)(1)(3)(5)(1)(6)(4)(7)“#End Region”前面必须是匹配的“#Region”
“#End Region”前面必须是匹配的“#Region”
本文档已存档,并且将不进行维护。
“#End Region”前面必须是匹配的“#Region”
Visual Studio 2005
使用 #Region,您可以指定在使用 Visual Studio 代码编辑器的大纲显示功能时要展开或折叠的代码块。#Region 语句的开头和结尾必须在同一个代码块中。
错误 ID:BC30680
在对应的 #EndRegion 语句之前的适当位置插入 #Region。君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
ESQL_语法元素
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口STL之Set:Set的基本用法 - 博客频道 - CSDN.NET
帝都无限好
& & & & 平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。
Set容器和其他容器差不多,无非就是相同的值不存,存进去自动排序好了。
& & & & 构造set集合的主要目的是为了快速检索,使用set前,需要在程序头文件中包含声明“#include&set&”。
1.创建set集合对象
& & & & & &创建set对象时,需要指定元素的类型,这一点和其他容器一样。
#include&iostream&
#include&set&
int main()
}2.元素的插入与中序遍历
& & & & 采用inset()方法把元素插入到集合中,插入规则在默认的比较规则下,是按元素值从小到大插入,如果自己指定了比较规则函数,则按自定义比较规则函数插入。使用前向迭代器对集合中序遍历,结果正好是元素排序后的结果。
#include&iostream&
#include&set&
int main()
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
set&int&:: //定义前向迭代器
//中序遍历集合中的所有元素
for(it = s.begin(); it != s.end(); it++)
cout && *it && & &;
//运行结果:1 3 5 63.元素的方向遍历
& & & & 使用反向迭代器reverse_iterator可以反向遍历集合,输出的结果正好是集合元素的反向排序结果。它需要用到rbegin()和rend()两个方法,它们分别给出了反向遍历的开始位置和结束位置。
#include&iostream&
#include&set&
int main()
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
set&int&::reverse_ //定义反向迭代器
//反向遍历集合中的所有元素
for(rit = s.rbegin(); rit != s.rend(); rit++)
cout && *rit && & &;
//运行结果:6 5 3 14.元素的删除
& & & & 与插入元素的处理一样,集合具有高效的删除处理功能,并自动重新调整内部的红黑树的平衡。删除的对象可以是某个迭代器位置上的元素、等于某键值的元素、一个区间上的元素和清空集合。
#include&iostream&
#include&set&
int main()
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
s.erase(6); //删除键值为6的元素
set&int&::reverse_ //定义反向迭代器
//反向遍历集合中的所有元素
for(rit = s.rbegin(); rit != s.rend(); rit++)
cout && *rit && & &;
set&int&::
it = s.begin();
for(int i = 0; i & 2; i++)
it = s.erase(it);
for(it = s.begin(); it != s.end(); it++)
cout && *it && & &;
s.clear();
cout && s.size() &&
运行结果:
*/5.元素的检索
& & & & & 使用find()方法对集合进行检索,如果找到查找的的键值,则返回该键值的迭代器位置;否则,返回集合最后一个元素后面的一个位置,即end()。
#include&iostream&
#include&set&
int main()
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
set&int&::
it = s.find(6); //查找键值为6的元素
if(it != s.end())
cout && *it &&
cout && &not find it& &&
it = s.find(20);
if(it != s.end())
cout && *it &&
cout && &not find it& &&
运行结果:
not find it
下面这种方法也能判断一个数是否在集合中:
#include &cstdio&
#include &set&
int main() {
for(int i = 0; i & 10; i++)
s.insert(i);
for(int i = 0; i & 5; i++) {
scanf(&%d&, &a);
if(!s.count(a)) //不存在
printf(&does not exist\n&);
printf(&exist\n&);
6.自定义比较函数
& & & & &使用insert将元素插入到集合中去的时候,集合会根据设定的比较函数奖该元素放到该放的节点上去。在定义集合的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值从小到大的顺序插入元素。但在很多情况下,需要自己编写比较函数。
编写比较函数有两种方法。
(1)如果元素不是结构体,那么可以编写比较函数。下面的程序比较规则为按键值从大到小的顺序插入到集合中。
#include&iostream&
#include&set&
struct mycomp
{ //自定义比较函数,重载“()”操作符
bool operator() (const int &a, const int &b)
if(a != b)
return a &
return a &
int main()
set&int, mycomp& //采用比较函数mycomp
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
set&int,mycomp&::
for(it = s.begin(); it != s.end(); it++)
cout && *it && & &;
运行结果:6 5 3 1
*/(2)如果元素是结构体,那么可以直接把比较函数写在结构体内。
#include&iostream&
#include&set&
#include&string&
struct Info
bool operator & (const Info &a) const // 重载“&”操作符,自定义排序规则
//按score由大到小排序。如果要由小到大排序,使用“&”即可。
return a.score &
int main()
//插入三个元素
info.name = &Jack&;
info.score = 80;
s.insert(info);
info.name = &Tom&;
info.score = 99;
s.insert(info);
info.name = &Steaven&;
info.score = 60;
s.insert(info);
set&Info&::
for(it = s.begin(); it != s.end(); it++)
cout && (*it).name && & : & && (*it).score &&
运行结果:
Steaven : 60
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()--返回一个用于比较元素间的值的函数
排名:千里之外}

我要回帖

更多关于 setstackfromend 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信