set容器的一个实例

狂砍八条街 2011-04-03 04:47:38


//实例5-17 set函数使用编程实例
#include <stdio.h>
#include <stdlib.h>
#include <set>
#include <iostream>
#include <functional>
#include <algorithm>
using namespace std;
//这个结构体是什么东西?
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, " "));
cout<<endl;
cout<<"Set B :";
copy(B.begin(),B.end(),ostream_iterator<const char*>(cout, " "));
cout<<endl;
cout<<"Union : ";//求并集。
set_union(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator<const char*>(cout," "),ltstr());//ltstr()这是什么,构造函数?
cout<<endl;
cout<<"Intersection : ";//求交集
set_intersection(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator<const char*>(cout," "),ltstr());
cout<<endl;
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," "));
cout<<endl;
}



这个结构体是什么东西?

还有ltstr()这是什么,构造函数吗?
...全文
295 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂砍八条街 2011-04-04
  • 打赏
  • 举报
回复
哦。。。有时间一定要看看
qq120848369 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vipvipvipvipvip 的回复:]

引用 9 楼 qq120848369 的回复:
ltstr是个仿函数类,用于set插入时候大小比较用的,set本质上是平衡二叉树,所以需要你提供一个const char *的比较方式。

所有的集合操作都是建立在集合已经排序的基础上,而set是平衡二叉树,其迭代器提供从小到大顺序遍历(平衡二叉树的中序遍历),所以你可以用集合操作对set放心的使用。


云里雾里,平衡二叉树就要提供一……
[/Quote]

因为数据结构里要用到key的大小比较方式,所以你得提供。

你买本STL源码剖析慢慢研读就懂了。
狂砍八条街 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq120848369 的回复:]
ltstr是个仿函数类,用于set插入时候大小比较用的,set本质上是平衡二叉树,所以需要你提供一个const char *的比较方式。

所有的集合操作都是建立在集合已经排序的基础上,而set是平衡二叉树,其迭代器提供从小到大顺序遍历(平衡二叉树的中序遍历),所以你可以用集合操作对set放心的使用。
[/Quote]

云里雾里,平衡二叉树就要提供一个const char *的比较方式?
狂砍八条街 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]
就跟class一样的 结构体中的一个成员函数 相当于一个类型定义
[/Quote]
但是把定义ltstr的struct改成class就不能通过编译啊
elegant87 2011-04-03
  • 打赏
  • 举报
回复
百度一下仿函数也就是函数对象
在STL中经常用到

qq120848369 2011-04-03
  • 打赏
  • 举报
回复
ltstr是个仿函数类,用于set插入时候大小比较用的,set本质上是平衡二叉树,所以需要你提供一个const char *的比较方式。

所有的集合操作都是建立在集合已经排序的基础上,而set是平衡二叉树,其迭代器提供从小到大顺序遍历(平衡二叉树的中序遍历),所以你可以用集合操作对set放心的使用。
pengzhixi 2011-04-03
  • 打赏
  • 举报
回复
因为你对这个方法理解错了,他实际上是找出集合1中元素与集合2中不同的。至于集合2有的元素集合1里面没有,它不管。
bargio_susie 2011-04-03
  • 打赏
  • 举报
回复
先弄清楚set_difference的涵义吧

OutputIterator set_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result );

Constructs a sorted range beginning in the location pointed by result with the set difference of range [first1,last1) with respect to [first2,last2) as content.

The difference of two sets is formed by the elements that are present in the first set, but not in the second one
狂砍八条街 2011-04-03
  • 打赏
  • 举报
回复
还有一个问题,,,

cout<<"Set C(difference of A and B) : ";
copy(C.begin(),C.end(),ostream_iterator<const char*>(cout," "));

这个输出结果是:
Set C(difference of A and B) : ephemeral nugatory serif

但是A、B的元素分别为:
Set A :artichoke ephemeral isomer nugatory prosaic serif
Set B :artichoke flat frigate isomer prosaic this

那么A,B不同的元素不是有很多,不止那3个元素啊
無_1024 2011-04-03
  • 打赏
  • 举报
回复
User-defined predicate function object that defines the sense in which one element is greater than another. The binary predicate takes two arguments and should return true when the first element is less than the second element and false otherwise.

用户定义谓词函数对象定义的意义
那个究竟是定义一个二元谓词函数
無_1024 2011-04-03
  • 打赏
  • 举报
回复

template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(
InputIterator1 _First1,
InputIterator1 _Last1,
InputIterator2 _First2,
InputIterator2 _Last2,
OutputIterator _Result
);
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>
OutputIterator set_union(
InputIterator1 _First1,
InputIterator1 _Last1,
InputIterator2 _First2,
InputIterator2 _Last2,
OutputIterator _Result,
BinaryPredicate _Comp
);

pengzhixi 2011-04-03
  • 打赏
  • 举报
回复
还有ltstr()这是什么,构造函数吗?
构造一个ltstr的匿名临时对象
無_1024 2011-04-03
  • 打赏
  • 举报
回复
就跟class一样的 结构体中的一个成员函数 相当于一个类型定义
bargio_susie 2011-04-03
  • 打赏
  • 举报
回复
函数对象,也叫仿函数
本套课程涵盖Kubernetes生态圈涉及到的所有知识点,包括K8S、Docker、harbor、Gitlab、Sonarqube、Nexus、Gogs、Prometheus、EFK、Istio、SpringCloud等,含有大量企业实战项目,项目均来自老师多年工作经验总结出的真实项目,让你学完之后,实现薪资增加。 课程知识点如下1、docker容器虚拟化平台的安装和配置-dockerfile构建企业级镜像2、docker资源配额和数据持久化3、docker实战-创建私有镜像仓库和加密认证4、containerd和podman容器的安装和使用5、kubernetes深度解读-架构-组件-资源对象6、使用kubeadm搭建生产环境的多master节点k8s高可用集群7、使用kubeadm搭建生产环境的单master节点k8s集群8、Pod入门到高级-Pod资源清单编写技巧9、Pod高级实战-pod亲和性和反亲和性10、Pod高级实战-pod生命周期和健康检测11、使用kubectl管理Kubernetes容器平台12、k8s控制器-Replicaset-Deployment13、k8s控制器-Daemonset-Job14、kubernetes四层代理Service-使用技巧和使用场景15、k8s持久化存储-常见的存储卷介绍16、kubernetes控制器-Statefulset详解-管理有状态的应用17、Apiserver安全机制之RBAC授权18、基于Ingress实现k8s七层调度和负载均衡19、k8s结合Prometheus构建企业级监控告警系统 本课程可以帮助从事运维工作的同学,和需要相关知识的人,推荐从事相关工作人员,提升提升自己的同学。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧