免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2997 | 回复: 11
打印 上一主题 下一主题

stl集合的转换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 20:08 |只看该作者 |倒序浏览
问题描述:
现在项目里面有一套类似于std::vector的类模板叫做Arr.和std::vector差不多,接口几乎一样(其实是比std::vector接口多一点)。
可以这么用,

Arr<int>                             a;          a.push_back(4) ;      a.push_back(4) ;
Arr<Arr<int*>>                  aa;        aa.push_back(a) ;
Arr<Arr<Arr<class A>>>    aaa ;     aaa.push_back(aa).

现在需要一个转换函数,将Arr<T1>转换为std::vector<T2>.其中T1如果也是个Arr的话,也许要转换。
举例:
Arr<int>                                      ------> vector<int>
Arr<Arr<int*>>                           -------> vector<vector<int>>
Arr<Arr<Arr<Arr<class_A>>>>   ---------> vector<vector<vector<vector<class_A*>>>>, 当然,如果class_A中的Arr是不需要转换的。

假如Foo实现这个功能,Foo可以这么用
Arr<Arr<Arr<int>>>a ;
...............
...............
vector<vector<vector<int>>> b = Foo(a) ;


搞了一个星期,也没有什么头绪,怀疑压根就不能搞定,请大伙给点想法,谢了先。
本人的一点想法:
由于类型不定,所以多半要用template。
从Arr的可能的对象来看,也是要用到递归。

难点:
如何从一个已知 Arr<..........> 的对象,获得其组织结构(也就是嵌了多少层Arr,),构造出函数的类型(template的类型参数是不支持递归定义的)


呵呵,以上描述可能有不规范的地方,大伙包涵下啊,有不清楚地方,我再解释

论坛徽章:
0
2 [报告]
发表于 2008-08-27 23:16 |只看该作者

回复 #1 duanwenhui 的帖子

论坛徽章:
0
3 [报告]
发表于 2008-08-27 23:34 |只看该作者

回复 #1 duanwenhui 的帖子

可以修改Arr得实现吗?不然估计没戏

论坛徽章:
0
4 [报告]
发表于 2008-08-28 10:31 |只看该作者
Arr的代码是不能改了,不过可以考虑把Arr重新包装一下

论坛徽章:
0
5 [报告]
发表于 2008-08-28 14:08 |只看该作者
这样
find -name '*.cpp' -o -name '*.h' | xargs 'sed/\<Arr\>/vector/' ?

论坛徽章:
0
6 [报告]
发表于 2008-08-28 15:04 |只看该作者
我觉得可以考虑一下Composite模式。递归的方向可能不是很正确。建议最好看看vector的实现

论坛徽章:
0
7 [报告]
发表于 2008-08-28 15:12 |只看该作者
原帖由 liveforlove 于 2008-8-27 23:04 发表
我觉得可以考虑一下Composite模式。递归的方向可能不是很正确。建议最好看看vector的实现


深表赞同

论坛徽章:
0
8 [报告]
发表于 2008-08-28 17:00 |只看该作者
原帖由 liveforlove 于 2008-8-28 15:04 发表
我觉得可以考虑一下Composite模式。递归的方向可能不是很正确。建议最好看看vector的实现


楼上两位的意见不是很理解...可以详细说说么?

论坛徽章:
0
9 [报告]
发表于 2008-08-28 17:10 |只看该作者
原帖由 duanwenhui 于 2008-8-27 20:08 发表
问题描述:
现在项目里面有一套类似于std::vector的类模板叫做Arr.和std::vector差不多,接口几乎一样(其实是比std::vector接口多一点)。
可以这么用,

Arr                             a;          a. ...


既然可以包装,那我就把Arr当成可以修改了,应该是等效的

我觉得用template的Traits和Policy技术应该是可以搞定的,目前想法是这样的:
构建一个policy类IsArr,用来判断类型是不是Arr
随后在Arr中定义一个traits叫vectorType:
typedef typename IfThenElse<IsArr<T>, vector<T::vectorType>, T> vectorType;
其中T就是Arr容器元素的类型

如此,Arr::vectorType就是你要得那个类型了

论坛徽章:
0
10 [报告]
发表于 2008-08-28 22:18 |只看该作者
ms我写复杂了,这样更简单:

// Purpose: convert list<list<...<T> > > to vector<vector<...<T> > >

// Author: Bood

// Date: 2008-08-28


#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;

// Construct return type

template <typename T>
struct ReturnType
{
&nbsp;&nbsp;typedef typename T return_type;
};

// Construct return type

template <typename T>
struct ReturnType<list<T> >
{
&nbsp;&nbsp;typedef typename vector< typename ReturnType<T>::return_type > return_type;
};

// Convert function

template <typename T>
vector<typename ReturnType<T>::return_type> foo(const list<T> &src)
{
&nbsp;&nbsp;vector<typename ReturnType<T>::return_type> v;
&nbsp;&nbsp;for(list<T>::const_iterator it = src.begin();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it != src.end();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++it) {
&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(foo(*it));
&nbsp;&nbsp;}
&nbsp;&nbsp;return v;
};

// Return immediately for other types

template <typename T>
T foo(const T &t)
{
&nbsp;&nbsp;return t;
};

int main()
{
&nbsp;&nbsp;list< list<int> > l;
&nbsp;&nbsp;for(int i=0;i<10;i++) {
&nbsp;&nbsp;&nbsp;&nbsp;list<int> ll;
&nbsp;&nbsp;&nbsp;&nbsp;for(int j=i*10;j<i*11;j++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ll.push_back(j);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;l.push_back(ll);
&nbsp;&nbsp;}

&nbsp;&nbsp;vector< vector<int> > v;
&nbsp;&nbsp;v = foo(l);
&nbsp;&nbsp;for(vector< vector<int> >::const_iterator it = v.begin();it!=v.end();++it) {
&nbsp;&nbsp;&nbsp;&nbsp;copy(it->begin(), it->end(), ostream_iterator<int>(cout, "\n"));
&nbsp;&nbsp;}
&nbsp;&nbsp;return 0;
}


[ 本帖最后由 bood 于 2008-9-1 10:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP