C++ 继承STL中的set求解答

starsmiling 2014-05-02 09:48:14
我在做一个关于c++的练习题,题目要求不能改动main函数,自己可以在main函数之外写代码来完成main函数的功能。
main函数如下:
int main()
{
int t;
cin >> t;
MySet<int> stInt;
int a[100];

while(t--) {
int n;
cin >> n;
for(int i = 0;i < n; ++i )
cin >> a[i];
MySet<int> stInt(a,a+n);
MyPrint(stInt.begin(),stInt.end());
cout << endl;
int s,e;
cin >> s >> e;
pair<MySet<int>::iterator, MySet<int>::iterator> p;
p = stInt.FindInterval(s,e);
if( p.first != p.second) {
MyPrint(p.first,p.second);
cout << endl;
}
else
cout << "Interval Not Found" << endl;
cin >> n;
MySet<double,greater<double> > stDouble;
for( int i = 0;i < n; ++i) {
double d;
cin >> d;
stDouble.insert(d);
}
MyPrint(stDouble.begin(),stDouble.end());
cout << endl;
double w;
cin >> w;
cout << * stDouble.upper_bound(w) << endl;
}


return 0;
}


主要功能是MySet能够读入int和double类型的变量并完成一些基于set的功能。我的代码:
template<typename T, class Compare = less<T>, class Alloc = allocator<T> >
class MySet:public set<T>
{
private:
T st[100];
public:
MySet():set<T>() {}
MySet(int *first, int *last)
{
int *idx = first;
for(int i = 0; idx <= last; ++idx, ++i)
st[i] = *idx;
}

pair<typename set<T>::iterator, typename set<T>::iterator>FindInterval(int lower, int upper)
{
typename set<T>::iterator low, up;
low = lower_bound(lower);
up = upper_bound(upper);
//if(low != *this->end() && up != *this->begin())
return (pair<typename set<T>::iterator, typename set<T>::iterator>(low, up));

}
void friend MyPrint(typename set<T>::iterator first_, typename set<T>::iterator last_);
};

template<typename T>
void MyPrint(typename MySet<T>::iterator first_, typename MySet<T>::iterator last_)
{
typename MySet<T>::iterator it = first_;
for(; it != last_; ++it)
cout << *it << " ";
}


在vs2010下编译总是出错:
unresolved external symbol "void __cdecl MyPrint(class std::_Tree_const_iterator<class std::_Tree_val<class std::_Tset_traits<double,struct std::less<double>,class std::allocator<double>,0> > >,class std::_Tree_const_iterator<class std::_Tree_val<class std::_Tset_traits<double,struct std::less<double>,class std::allocator<double>,0> > >)" (?MyPrint@@YAXV?$_Tree_const_iterator@V?$_Tree_val@V?$_Tset_traits@NU?$less@N@std@@V?$allocator@N@2@$0A@@std@@@std@@@std@@0@Z) referenced in function _main

MyPrint的功能是打印出MySet里的所有元素,请大神赐教!万分感谢!
...全文
317 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
FireBrother324 2014-05-06
  • 打赏
  • 举报
回复
难道是因为我没有加命名空间?
FireBrother324 2014-05-06
  • 打赏
  • 举报
回复
本来我也是这么写的,但是调用lower_bound和upper_bound的时候本地调试通过,上传以后是CE,所以自己写了一份。
另外,直接找lower_bound(s+1)不一定对吧,又不保证是整数。
Focustc 2014-05-04
  • 打赏
  • 举报
回复
这个题。。。调了三个多小时 不过比起楼上有种更简单的实现: 因为继承了set,所以相应的upper_bound等都可以直接用了
template<class T,class Pred = less<T> >
class MySet:public set<T,Pred>{
    public:
        typedef typename set<T,Pred>::iterator iterator;
        MySet(T* first,T* last):set<T,Pred>(first,last){}
        MySet(){}
        pair<iterator,iterator> FindInterval(T s,T e){
            iterator fp = set<T,Pred>::lower_bound(s+1);
            iterator lp = set<T,Pred>::lower_bound(e);
            return make_pair(fp,lp);
        }
};

template<class T>
void MyPrint(T pa,T pb){
    for(;pa!=pb;pa++)
        cout << *pa << ' ';
}
黑色眼睛90 2014-05-04
  • 打赏
  • 举报
回复
麻烦给解释下: typedef typename set<T,Pred>::iterator iterator; 没看懂呀!!
starsmiling 2014-05-04
  • 打赏
  • 举报
回复
我发现我写的好复杂。。。楼上两位挺简洁的。。。。 typedef typename set<T,Pred>::iterator iterator;这个学习了。。。 我实在是个菜鸟。。。躲墙角去了。。。
王贰 2014-05-04
  • 打赏
  • 举报
回复
coursera...
黑暗贤者 2014-05-03
  • 打赏
  • 举报
回复
继承之后就不能用low_bound...有没有办法解决
lymh 2014-05-03
  • 打赏
  • 举报
回复
唉这题真心坑爹啊,,,本来做魔兽就很无语了这个还改了一下午
FireBrother324 2014-05-03
  • 打赏
  • 举报
回复
看在是同学的份上…… 写了好久才把这个题A了,模板太蛋疼了。
template<class T,class CP=less<T> >
class MySet:public set<T,CP>
{
public:
	MySet(){}
	MySet(T* _beg,T* _end):set<T,CP>(_beg,_end){}
	typedef typename set<T,CP>::iterator iterator;
	iterator begin(){return set<T,CP>::begin();}
	iterator end(){return set<T,CP>::end();}
	pair<iterator,iterator> FindInterval(T _s,T _e);
	iterator lower_bound(T key);
	iterator upper_bound(T key);
};

template<class T>
void MyPrint(const T _beg,const T _end)
{
	T itr=_beg;
	while(itr!=_end)
	{
		cout<<*itr<<' ';
		++itr;
	}
}

template<class T,class CP>
pair<typename MySet<T,CP>::iterator,typename MySet<T,CP>::iterator> MySet<T,CP>::FindInterval(T _s,T _e)
{
	iterator _beg,_end;
	_beg=lower_bound(_s);
	_end=upper_bound(_e);
	return make_pair(_beg,_end);
}

template<class T,class CP>
typename MySet<T,CP>::iterator MySet<T,CP>::lower_bound(T key)
{
	iterator itr=begin();
	CP cp;
	while((cp(*itr,key)||*itr==key)&&itr!=end())
		++itr;
	return itr;
}

template<class T,class CP>
typename MySet<T,CP>::iterator MySet<T,CP>::upper_bound(T key)
{
	iterator itr=begin();
	CP cp;
	while(cp(*itr,key)&&itr!=end())
		++itr;
	return itr;
}
starsmiling 2014-05-02
  • 打赏
  • 举报
回复
Hi, 谢谢你的建议啊!真的行了!但是还有一个问题,我的MySet无参构造函数默认比较大小按照less<T>。但是main函数里面有一句MySet<double,greater<double> > stDouble,这个要求stDouble按照greater<double>比较大小。。但是我的code貌似还是按照less<double>比较大小。。。请教一下这个问题该怎么解决呀?谢谢啦~
starsmiling 2014-05-02
  • 打赏
  • 举报
回复
我想把MySet的Pred 类初始化到MySet的构造函数中,代码如下:
MySet():set<T>() {Pred pr = less<T>;}
		MySet(int *first, int *last):set<T> (first, last) { Pred pr = less<T>;}
但是编译出错: error C2275: 'std::less<_Ty>' : illegal use of this type as an expression with [ _Ty=int ] 请教这是什么原因呢?
奉壹 2014-05-02
  • 打赏
  • 举报
回复
template<typename T>
void MyPrint(T first_, T last_)
{
    T it = first_;
    for(; it != last_; ++it)
        cout << *it << " ";
}
直接这样写就可以啦 楼主你在研究stl源码吗,看得我头好大,我还是太菜了 我写迭代器大多用auto,感觉腰不酸腿不疼,写起来好爽
显圣真君 2014-05-02
  • 打赏
  • 举报
回复
大概意思是你没有实现常量迭代器相关的内容,就是说有一个iterator 还有一个const_iterator 具体的话,你可以看看STL,因为这个本人没研究过

65,208

社区成员

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

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