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()这是什么,构造函数吗?
...全文
298 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
函数对象,也叫仿函数

65,186

社区成员

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

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