类中应用标准库迭代器问题~~~

Lokioo 2003-05-05 10:02:19
#ifndef _setOperate
#define _setOperate
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
template<class T>
class set1
{
public:
set1(set<T>&);
set1(istream&,int );
void intersection(set1<T>&);//求两个集合交集
void merge(set1<T>&);//求两个集合并集
bool belongto(T&);//单个元素是否属于集合
bool belongto(set1<T>&);//集合是否属于另一个集合

set<T> coll;//集合元素结构
set<T> interset;
set<T> mergeset;
};

template <class T>
set1<T>::set1(set<T>& a)
{
copy(a.begin(),a.end(),coll.begin());
};
template <class T>
set1<T>::set1(istream& in,int n)
{
T tmp;
for(int i=0;i<n;++i)
{
in>>tmp;
coll.insert(tmp);
}
};
template <class T>
void set1<T>::intersection(set1<T>& b)
{
set<T>::iterator pos=b.coll.end();//为什么这些迭代器使用不正确!
set<T>::iterator p=coll.begin();
for(;p<coll.end();++p)
{
if(b.coll.find(*p)!=pos)
interset.insert(*p);
}
}
template <class T>
void set1<T>::merge(set1<T>& b)
{
copy(coll.begin(),coll.end(),mergeset.begin());
set<T>::iterator pos=mergeset.end(),p=b.coll.begin();//!!!!
for(;p<b.coll.end();++p)
{
if(mergeset.find(*p)!=pos)
mergeset.insert(*p);
}
}
template <class T>
bool set1<T>::belongto(T& b)
{
if(coll.find(b)!=coll.end())
return true;
return false;
}
template <class T>
bool set1<T>::belongto(set1<T>& b)
{
set<T>::iterator p=b.coll.begin(),pos=coll.end();
for(;p<b.coll.end();++p)
{
if(coll.find(*p)==pos)
break;
}
if(p!=b.coll.end())
return false;
return true;
}
#endif
int main()
{
}
//希望多多帮忙~~我一直对template 掌握不好~~这次和标准库共同使用
//更是~~~惨啊~~谢谢了
...全文
25 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
merlinran 2003-05-06
  • 打赏
  • 举报
回复
交集、并集这些涉及两个集合的操作,不应该是成员函数。即使用成员函数来实现,也应该是依据计算结果返回另一个集合,而不是在集合中添上set<T> interset;set<T> mergeset;这些东西。
每一个集合都has a交集,这听起来对吗?
setl<T> intersect(const setl<T>& lhs, const setl<T>& rhs);
setl<T> merge(const setl<T>& lhs, const setl<T>& rhs);
注意,不能返回引用,只能返回值。这和operator+()不能返回引用是一样的,因为它建立的是一个新对象。
liu_feng_fly 2003-05-06
  • 打赏
  • 举报
回复
这是叠带器失效的问题,通常当你对一个容器进行了删除,插入,移动元素等等操作,就是调用了容器类的非const成员函数,无论是直接的还是间接的,都有可能导致叠带器失效,就是这些叠带器不再指向正确的位置。当然,不同的容器他们的叠带器失效的时机还是不一样的,比如,当vector删除一个元素后,这个vector的所有叠带器都可以认为失效或者可能失效,但是当list删除一个元素之后,只有指向这个元素的叠带器失效,其他的仍然有效。
shadowstar 2003-05-06
  • 打赏
  • 举报
回复
那个是什么,coll,没用过啊
Jinglihui 2003-05-05
  • 打赏
  • 举报
回复
明白你的意思:P但是头一次见这么用的:{
Jinglihui 2003-05-05
  • 打赏
  • 举报
回复
下边是你的迭代器的用法:
set<T>::iterator pos=b.coll.begin();//为什么这些迭代器使用不正确!
而我的是:
set<T>::iterator pos=b.begin();
我一直是这么用的,不知道你当中的coll是什么意思?!
Lokioo 2003-05-05
  • 打赏
  • 举报
回复
nvle~~~help!

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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