函数模板,有点复杂,.请大家来帮我看下模板.....讚

pusshi 2008-11-05 08:39:08
以上是两个函数模板,主要用处就是/把比el小的数存进ia2,把比el大的数存进ivec2;
第一个,我已编好了运行正确,
但我又换了个思路,
把查找的数组和向量复制一份并排序,
用grater()递增函数
比较和el的大小,因为是排序过的,所以只要有一个比el大,后面的都不用比了,只需查找一次
然后删掉后面的所以数据.
但没写出来,各位高手看看应该怎么改,谢谢,注:也像第一模板一样,能适应数组,
以下是代码....
//把比el小的数存进ia2,把比el小的数存进ivec2;
#include <iostream>
#include <vector>
#include <functional>//less() greater()
#include <algorithm>//find_if

using namespace std;

/*template <typename initerator, typename outiterator,
typename elem, typename comp>
outiterator
filter(initerator first, initerator last, outiterator at,
const elem &val, comp pred)
{
while( (first= find_if(first, last, bind2nd(pred, val)) ) != last)//bind2nd(pred,val)是将val值绑定到
{ //pred所带表的比较函数的第二参数上,然后依次从first~last中取数和val比较
cout<<"found value: "<<*first<<endl; //整体返回小于val的initerator指针,
*at++ = *first++;
}
return at;
}
*/
template <typename initerator, typename outiterator,
typename elem, typename comp>
void
filter(initerator first, initerator last, outiterator at, const elem &val, comp pred)
{
initerator temp=first;
outiterator st= at;
outiterator qt= at;
for (; first != last; ++first)
{
*st++ = *first++;
}

sort(qt, st);

while( (qt= find_if(qt, st, bind2nd(pred, val)) ) != st)//bind2nd(pred,val)是将val值绑定到
{ //pred所带表的比较函数的第二参数上,
cout<<"found value: "<<*at<<endl; //整体返回小于val的initerator指针,
at.erase(qt, st);
}


}



int main()
{
const int el=8;

int ia[el]={12, 8, 43, 0, 6, 21, 3, 7};
vector<int> ivec(ia, ia+el);

// int ia2[el];
vector<int> ivec2(el);

cout<<"filtering integer array for values less than 8\n";
// filter(ia, ia+8, ia2, el, less<int>() );//less递减

cout<<"filtering integer vector for values less than 8\n";
filter(ivec.begin(), ivec.end(), ivec2.begin(), el, greater<int>() );//greater递增
return 0;
}
...全文
133 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaojiew 2008-11-06
  • 打赏
  • 举报
回复
你的想法显然麻烦了,星羽哥哥的做法是不错的。。要保存一份原始数据是很简单的。。比如你的程序就保存了一份

至于要想修改你的程序的话,可以把传入的第三参数改为容器,里面
outiterator st= at.begin();
outiterator qt= at.begin();就可以了
星羽 2008-11-06
  • 打赏
  • 举报
回复
你这样是简单了,但你把用户的数据排序了,不要动用户的数据,只能复制一份再排序.

---------

那你就改成复制一份再排序啊。。。。。
星羽 2008-11-06
  • 打赏
  • 举报
回复
,问题是怎么才能删除数组中的数呢有没有什么通用的删除函数


-------

c风格数组是不可能删除的,大小的固定的
pusshi 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Chiyer 的回复:]
这样不是更简单些?


C/C++ code
//把比el小的数存进ia2,把比el大的数存进ivec2;
#include <iostream>
#include <vector>
#include <functional>//less() greater()
#include <algorithm>//find_if

using namespace std;

/*template <typename initerator, typename outiterator,
typename elem, typename comp>
outiterator
filter(initerator first, initerator last, outiterator at,
const elem &val,…
[/Quote]
你这样是简单了,但你把用户的数据排序了,不要动用户的数据,只能复制一份再排序.
后面请高手帮我写下,我不知道如何写了,
正如3楼所说,at.erase(qt, st);不能适应数组,这我知道,问题是怎么才能删除数组中的数呢有没有什么通用的删除函数,或什么方法,请高手帮我改成能运行的...谢谢
pusshi 2008-11-06
  • 打赏
  • 举报
回复

在不改动用户数据的前提下,只能复制一份源数据.问题就在这里了.

因为前面都是用抽像指针从源数据找出然后解指针后赋给目标容器.

复制是好复制但麻烦就在这.我们往哪里复制呢,只能往目标容器里复制,

要说从新定义个新容器.没法定义,(模板传进来的是目标容器的首地址,不知道容器类型)

但现在复制了一份,并且排序变成这个样子={0, 3, 6, 7, 8, 12, 21, 43};
现在我们想返回8后面的几位.由于数组是不能删除的,现在怎办,...................

请各位高手不要光说不练,给我实现一下,可以改接口,还有前面 星羽哥哥的做法是可以,和第一个模板差不多,但他就不能支持less递减或greater递增函数的传入.....

pusshi 2008-11-06
  • 打赏
  • 举报
回复

在不改动用户数据的前提下,只能复制一份源数据.问题就在这里了.

因为前面都是用抽像指针从源数据找出然后解指针后赋给目标容器.

复制是好复制但麻烦就在这.我们往哪里复制呢,只能往目标容器里复制,

要说从新定义个新容器.没法定义,(模板传进来的是目标容器的首地址,不知道容器类型)

但现在复制了一份,并且排序变成这个样子={0, 3, 6, 7, 8, 12, 21, 43};
现在我们想返回8后面的几位.由于数组是不能删除的,现在怎办,...................

请各位高手不要光说不练,给我实现一下,可以改接口,还有前面 星羽哥哥的做法是可以,和第一个模板差不多,但他就不能支持less递减或greater递增函数的传入.....

pusshi 2008-11-06
  • 打赏
  • 举报
回复

在不改动用户数据的前提下,只能复制一份源数据.问题就在这里了.

因为前面都是用抽像指针从源数据找出然后解指针后赋给目标容器.

复制是好复制但麻烦就在这.我们往哪里复制呢,只能往目标容器里复制,

要说从新定义个新容器.没法定义,(模板传进来的是目标容器的首地址,不知道容器类型)

但现在复制了一份,并且排序变成这个样子={0, 3, 6, 7, 8, 12, 21, 43};
现在我们想返回8后面的几位.由于数组是不能删除的,现在怎办,...................

请各位高手不要光说不练,给我实现一下,可以改接口,还有前面 星羽哥哥的做法是可以,和第一个模板差不多,但他就不能支持less递减或greater递增函数的传入.....

帅得不敢出门 2008-11-05
  • 打赏
  • 举报
回复
注:也像第一模板一样,能适应数组

所以at.erase(qt, st);不管能不能用都是错误的
星羽 2008-11-05
  • 打赏
  • 举报
回复
这样不是更简单些?


//把比el小的数存进ia2,把比el大的数存进ivec2;
#include <iostream>
#include <vector>
#include <functional>//less() greater()
#include <algorithm>//find_if

using namespace std;

/*template <typename initerator, typename outiterator,
typename elem, typename comp>
outiterator
filter(initerator first, initerator last, outiterator at,
const elem &val, comp pred)
{
while( (first= find_if(first, last, bind2nd(pred, val)) ) != last)//bind2nd(pred,val)是将val值绑定到
{ //pred所带表的比较函数的第二参数上,然后依次从first~last中取数和val比较
cout<<"found value: "<<*first<<endl; //整体返回小于val的initerator指针,
*at++ = *first++;
}
return at;
}
*/
template <typename initerator, typename outinster,
typename elem>
void filter(initerator first, initerator last, outinster ist, const elem &val)
{
sort(first, last);

for (; first != last; ++first)
{
if (*first > val)
ist++ = *first;
}

}

int main()
{
const int el=8;

int ia[el]={12, 8, 43, 0, 6, 21, 3, 7};
vector<int> ivec(ia, ia+el);

// int ia2[el];
vector<int> ivec2;

cout<<"filtering integer array for values less than 8\n";
// filter(ia, ia+8, ia2, el, less<int>() );//less递减

cout<<"filtering integer vector for values less than 8\n";
filter(ivec.begin(), ivec.end(), back_inserter(ivec2), el);//greater递增


return 0;
}


星羽 2008-11-05
  • 打赏
  • 举报
回复
at.erase(qt, st);

迭代器没有erase功能,要容器

65,211

社区成员

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

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