如何能够快速合并两个stl的set呢?

firstilo 2006-10-17 02:52:43
set好像没有类似merge的函数
要想合并两个set的内容,怎样做效率会比较高呢?
...全文
2985 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-10-18
  • 打赏
  • 举报
回复
你看一下stl源码剖析就知道区别了
merge保留重复。
firstilo 2006-10-17
  • 打赏
  • 举报
回复
其实具体的性能参数我现在也说不上来,
我现在就是觉得有点抓瞎的感觉。。。
set_union和merge有什么区别呢?
taodm 2006-10-17
  • 打赏
  • 举报
回复
实时系统,数据量很大,这个是废话,你还是没有说出具体性能指标差了多少,这么优化是抓瞎。
用排序vector代替set,用set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.end()));是个还算可行的方案。
sinall 2006-10-17
  • 打赏
  • 举报
回复
#include <set>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
set<int> a;
a.insert(1);
a.insert(6);
a.insert(5);
set<int> b;
a.insert(2);
a.insert(7);
a.insert(9);
set<int> c;
set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.end()));
copy(c.begin(), c.end(), ostream_iterator<int>(cout, " "));
return 0;
}

另外,最好用排序vector替代set。
见《Effective STL》“条款23:考虑用有序vector代替关联容器”
firstilo 2006-10-17
  • 打赏
  • 举报
回复
实时系统,数据量很大
就是会有很多小的数据集合,每个小的数据集合里面有可能会有很多元素
taodm 2006-10-17
  • 打赏
  • 举报
回复
哈哈,如果s1.insert( s2.begin(), s2.end() );还不能满足你的效率,你就得说你到底要求啥程度的效率了。
firstilo 2006-10-17
  • 打赏
  • 举报
回复
s1.insert( vect1.begin(), vect.end() );

s1.insert( s2.begin(), s2.end() );
比起来还是会快一些吧?
我现在的问题是
for(s2_iter = s2.begin(); s2_iter != s2.end(); ++s2_iter)
{
si.insert( *s2_iter );
}
的效率不能让人满意,需要找到更好的办法
即便修改数据结构也在所不惜
请各位指教!
哇哇大哭的谢!
taodm 2006-10-17
  • 打赏
  • 举报
回复
s1.insert( s2.begin(), s2.end() );

for(s2_iter = s2.begin(); s2_iter != s2.end(); ++s2_iter)
{
si.insert( *s2_iter );
}
呃,s1.insert( s2.begin(), s2.end() );只会高,不会低。但,也高得很有限。
一般不必考虑。
firstilo 2006-10-17
  • 打赏
  • 举报
回复
s1.insert( s2.begin(), s2.end() );

for(s2_iter = s2.begin(); s2_iter != s2.end(); ++s2_iter)
{
si.insert( *s2_iter );
}
比起来,效率会高一些么?
Wolf0403 2006-10-17
  • 打赏
  • 举报
回复
去看 Effective STL 吧。
firstilo 2006-10-17
  • 打赏
  • 举报
回复
哦,hash_set和set有什么关系么?
哪个插入效率更高?
lw1a2 2006-10-17
  • 打赏
  • 举报
回复
set本来就是排好序的
firstilo 2006-10-17
  • 打赏
  • 举报
回复
这个是要求s1和s2都是有序的吧?
如果无序怎么办呢?
taodm 2006-10-17
  • 打赏
  • 举报
回复
s1.insert(s2.begin(), s2.end());
lw1a2 2006-10-17
  • 打赏
  • 举报
回复
泛型的,一般比你自己写的要高,去查查吧
sinall 2006-10-17
  • 打赏
  • 举报
回复
-_-!!!
set_union
具体
set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3, s3.begin()));
sinall 2006-10-17
  • 打赏
  • 举报
回复
set_union
具体
set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3));

64,654

社区成员

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

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