一道面试题目,std::map相关的

magicpang 2009-10-27 09:55:46
下面是题目,请大侠讲解下



// There's class contains data whose source code could not be modified
// and we define class appdataset using them
#define DATA1_LEN 100
class data1 {
int *m_data;
public:
data1(): m_data(new int[DATA1_LEN]) {}
~data1() { delete[] m_data; }
};

#define DATA2_LEN 200
class data2 {
int *m_data;
public:
data2(): m_data(new int[DATA2_LEN]) {}
~data2() { delete[] m_data;}
};

// appdataset using the class upwards
// check out the code, and fix the bugs in the following code.
class appdataset {
typedef map(string, void*) dataset;
dataset m_dataset;
public:
template <class data>
string add(data *pdata) {
string strID = generateID(pdata);
m_dataset.insert(pair<string, void*>(strID, pdata));
return strID;
}
template <class data>
string generateID(data* pdata) {
/* omit */
}

void remove(string strID) {
dataset::iterator it = m_dataset.find(strID);
if(m_dataset.end() != it) {
delete it->second;
}

m_dataset.erase(it);
}
};

...全文
188 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2009-10-28
  • 打赏
  • 举报
回复
delete it->second;
这个删的是void类型指针,需要转换一下。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 magicpang 的回复:]
引用 4 楼 akirya 的回复:
dataset存的是啥? void*是不是data1 data2 转化过去的?
要是转化过去的话再delete 的时候需要转化回去再删除.

是的阿,就是data1, data2,转过去的
可是怎么转化回去呢?
[/Quote]
插入的时候记录下是啥类型的,删除的时候根据记录转化回去。
magicpang 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yshuise 的回复:]
data1和data2几乎一样,为啥不重用?
[/Quote]
笔试题里面说,这个data1, data2是第三方提供的,源代码不可见,不能修改的
hazrael 2009-10-28
  • 打赏
  • 举报
回复
需要强制转换啊,无论是增还是删,否则都有问题
yshuise 2009-10-28
  • 打赏
  • 举报
回复
class appdataset {
typedef map(string, void*) dataset; //没见过这种写法
dataset m_dataset;
public:
template <class data>
string add(data *pdata) {
string strID = generateID(pdata);
m_dataset.insert(pair<string, void*>(strID, pdata));//pair一般用make_pair。但用pair不是错误。
return strID;
}
template <class data>
string generateID(data* pdata) {
/* omit */
}

void remove(string strID) {//删除任何key都要重构红黑树。不仅效率低,而且迭代器失效。
dataset::iterator it = m_dataset.find(strID);
if(m_dataset.end() != it) {
delete it->second;
}

m_dataset.erase(it);
}
};
yshuise 2009-10-28
  • 打赏
  • 举报
回复
data1和data2几乎一样,为啥不重用?
yshuise 2009-10-28
  • 打赏
  • 举报
回复
#define DATA1_LEN 100
class data1 {
int *m_data;
public:
data1(): m_data(new int[DATA1_LEN]) {}
~data1() { delete[] m_data; }
};

宏定义是设计上的失误。new最大的优势,在于可以动态指定申请的长度。
所以应该由构造函数来完成要申请的长度。
sj13426074890 2009-10-28
  • 打赏
  • 举报
回复
mark
yangjianghua 2009-10-27
  • 打赏
  • 举报
回复
delete it->second;
m_dataset.erase(it);
先删除it->second指针,然后又删除it,
是不是会找不到it->second指针呢?
magicpang 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 akirya 的回复:]
dataset存的是啥? void*是不是data1 data2 转化过去的?
要是转化过去的话再delete 的时候需要转化回去再删除.
[/Quote]
是的阿,就是data1, data2,转过去的
可是怎么转化回去呢?
  • 打赏
  • 举报
回复
dataset存的是啥? void*是不是data1 data2 转化过去的?
要是转化过去的话再delete 的时候需要转化回去再删除.
whg01 2009-10-27
  • 打赏
  • 举报
回复
MARK 明天看
magicpang 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
typedef map(string, void*) dataset;
这样子写可以吗?
[/Quote]
这个是其中的一个,我也发现了这个问题,不过面试官说这个是个问题,还有由此带来的别的问题
ryfdizuo 2009-10-27
  • 打赏
  • 举报
回复
typedef map(string, void*) dataset;
这样子写可以吗?

64,643

社区成员

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

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