求std::map与typedef的联合使用

redlz2500 2013-02-20 08:45:09
std::map本身也是一个模板了,在使用的过程中也很方便,但是我想如果每次将类型定义写在代码中,那么维护起来应该是很困难的事情
比如


class c(){
public:
std::map<int,myObj> m_C;
};

这样的写法感觉很不爽啊(不知道为什么,就是觉得不爽)
所以希望能写成

class c(){
public:
MContainer<myObj> m_C;
};

这样的格式,但是使用typedef的时候试验不通,查找了一些资料但是完全看不懂
求各位帮我改下好吗?

哦,想起来了,因为使用std::map的话搞不清楚这个到底是用来干什么的,而使用自定义的名称MContainer的话,可维护性要好多了吧!
...全文
293 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-02-21
  • 打赏
  • 举报
回复
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
Coder_Y_Jao 2013-02-20
  • 打赏
  • 举报
回复
如一楼所说,MContainer<myObj>不是具体型别,依赖于myObj; 如果你的编译器不支持c++11,可以使用如下的替代方案: 1、继承

template<class T>
class MContainer : public std::map<int, T>
{
//构造函数省略
};
2、萃取

template<class T>
struct MContainer 
{
	typedef std::map<int, T> type;
};
第二种方法使用时得这样:

MContainer<myObj>::type  m_C;
redlz2500 2013-02-20
  • 打赏
  • 举报
回复
引用 9 楼 redlz2500 的回复:
引用 8 楼 ajey2005 的回复:正是因为你不理解map是什么东西,所以你才觉得多敲几个字就烦了。我觉得有意思的是你复制代码3遍是为了什么?可以看看这里能不能复用一下,抽象出来通用的东西解放你容易烦躁的灵魂…… 是这样的,Entity是基类,下面有E1、E2、E3,在程序设计中全部是public继承,因为想用派生类转基类的功能,我想这个是可以复用的吧?全部设定……
晕,刚才发现因为Ex和pair不是一样的东西,没办法包括在一个temple处理类中去…… 果然还是无法呢
FingerStyle 2013-02-20
  • 打赏
  • 举报
回复
因为使用std::map的话搞不清楚这个到底是用来干什么的,而使用自定义的名称MContainer的话,可维护性要好多了吧! 维护性不会好, 只是偷懒少敲几个字而已。 MContainer不能真正表现出map的意思,map更直观。 MContainer像个vector。。之类。
FingerStyle 2013-02-20
  • 打赏
  • 举报
回复
typedef std::map<int,myObj> MContainer; MContainer c;
图灵狗 2013-02-20
  • 打赏
  • 举报
回复
用define吧。
rocktyt 2013-02-20
  • 打赏
  • 举报
回复
c++11开始才支持模板的别名,语法是 template<typename myObj> using MContainer= std::map<int, myObj>; typedef必须是具体类型才能定义别名
redlz2500 2013-02-20
  • 打赏
  • 举报
回复
引用 8 楼 ajey2005 的回复:
正是因为你不理解map是什么东西,所以你才觉得多敲几个字就烦了。我觉得有意思的是你复制代码3遍是为了什么?可以看看这里能不能复用一下,抽象出来通用的东西解放你容易烦躁的灵魂……


是这样的,Entity是基类,下面有E1、E2、E3,在程序设计中全部是public继承,因为想用派生类转基类的功能,我想这个是可以复用的吧?全部设定为Entity类型
另外还有一个pair,是一个数据读取对应表,这个就是单独的了,因为这个东西压根就不是一个类啊。
无猫皆笼 2013-02-20
  • 打赏
  • 举报
回复
正是因为你不理解map是什么东西,所以你才觉得多敲几个字就烦了。我觉得有意思的是你复制代码3遍是为了什么?可以看看这里能不能复用一下,抽象出来通用的东西解放你容易烦躁的灵魂……
redlz2500 2013-02-20
  • 打赏
  • 举报
回复
引用 4 楼 classpatterns 的回复:
因为使用std::map的话搞不清楚这个到底是用来干什么的,而使用自定义的名称MContainer的话,可维护性要好多了吧! 维护性不会好, 只是偷懒少敲几个字而已。 MContainer不能真正表现出map的意思,map更直观。 MContainer像个vector。。之类。
也不能这样说吧,刚才我正想直接将代码复制3遍,但是发现这样的话维护看起来很烦啊,虽然可以用替换来搞定,但是还是觉得很烦的说。
redlz2500 2013-02-20
  • 打赏
  • 举报
回复
谢谢。 顺便说个题外话,刚才翻到我2011年学习的时候写的一个存储,最后只实现了链表功能,不过现在把这个老代码翻出来看,我觉得还不如直接使用pair和map来得简单的好,


//链表式存储
//节点
template<class TNodeData>
class StorageNode
{
public:
	StorageNode();
	~StorageNode();

	void StoreData(TNodeData data);
	TNodeData GetData();

	void SetIndex(UID index);
	UID GetIndex();
	
	void StoreData(TNodeData data, UID index);

	StorageNode<TNodeData>* m_pPre;//前一个的指针
	StorageNode<TNodeData>* m_pNext;//后一个指针
private:
	TNodeData m_data;//存储数据
	UID m_index;//存储顺序的依据
};


//自身根据数据量的大小来选择使用链表还是使用哈希表
//该功能待添加
template<class TNodeData>
class Storage
{
public:
	Storage();
	~Storage();
	//int Store(TNodeData p_data);	//直接存储一个数据,id使用随机值获取
	int Store(TNodeData p_data,UID p_index);//直接存储一个数据,可能会有重复,会自行进行判断
	TNodeData GetData(UID p_index);//通过索引获取数据	
	UID GetMaxID();	//返回一个最大的ID,主要是在模块进行使用,对于物品和变量,则没有必要进行使用
	int Remove(UID p_index);//通过索引移除一个数据(节点)
	void Abandon();//放弃内部节点,和Clear之间的具体用法待定
	void Clear();//删除所有内部的接点以及数据
	StorageNode<TNodeData>* GetHead();	//返回第一个元素的节点
protected:
	//将Node类封装起来
	StorageNode<TNodeData>* StoreN(StorageNode<TNodeData>* p_node);//插入一个节点,这个节点在原来的数据存储中是没有的
	StorageNode<TNodeData>* GetNode(UID p_index);//通过索引获取节点以便直接存储数据,内部调用
	INT Remove(StorageNode<TNodeData>* p_node);//通过节点移除一个节点,通过节点方式
	INT m_iCount;//Storage总的物品类别数量
	void Convert();//Storage在两种模式之间转换
	StorageNode<TNodeData>* m_head;//Storage链表指针头
	BOOL m_bLinkMode;//Storage true=link模式,false=hash模式
	UID m_maxID;	//内部存储的最大id
	BOOL m_bisP;//存储的数据是否是指针的一个判断
};
厄……顺便问一下,我这个代码是否非常丑陋非常无用?是否应该直接摒弃转而使用map了? 另外map查找在100万以内都是很强悍的吗? 谢谢。

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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