map中嵌套map怎么用?

ybin225 2012-02-24 11:01:14
map<CString,map<long,POI_INFO>* >::iterator itrMap;
map<long,POI_INFO>::iterator itrPoi;
for( int i = 0; i < nMeshCount; ++i )
{
CAdfDataBase *pDataBase = poAtlas->GetAt(i);
if ( NULL == pDataBase )
continue;

CString strMeshPath = poAtlas->GetMeshPathAt(i);
CString strMesh = poAtlas->GetMeshNameAt(i);

map<long,POI_INFO> mapPoi;
long lsize = mapPoi.size();
this->dppSavePOIInfo(pDataBase,mapPoi); //该函数用于往mapPoi中存数据
long ntlsize = mapPoi.size();
m_mapPOI.insert( pair< CString,map<long,POI_INFO>* >(strMesh,&mapPoi) );

itrMap = m_mapPOI.find("H51F021002");
long nSndsize = itrMap->second->size(); //每次都都查找的同一个图幅号,这个size怎么都回变化?

}
出了for循环后再使用: itrMap = m_mapPOI.find("H51F021002");
long nSndsize = itrMap->second->size();
获取到的size为0...这是为什么?求指教
...全文
437 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybin225 2012-02-24
  • 打赏
  • 举报
回复
为什么指针不行,存对象就可以呢?我是菜鸟,还望多多指教,谢谢··
[Quote=引用 3 楼 wangjunsheng 的回复:]

那你就存对象吧
map<CString, map<long,POI_INFO> >
然后拷贝对象
[/Quote]
ybin225 2012-02-24
  • 打赏
  • 举报
回复
我是要把mapPoi放入m_mapPOI中,为什么要swap呢?
[Quote=引用 4 楼 wangjunsheng 的回复:]

for () {
map<long,POI_INFO> mapPoi;

mapPoi[1] = xxx;
mapPoi[2] = xxx;
mapPoi[3] = xxx;
....

m_mapPOI["H51F021002"].swap(mapPoi);
}

可以兴许可以减少些许不必要的拷贝
[/Quote]
乃不知有汉 2012-02-24
  • 打赏
  • 举报
回复
for () {
map<long,POI_INFO> mapPoi;

mapPoi[1] = xxx;
mapPoi[2] = xxx;
mapPoi[3] = xxx;
....

m_mapPOI["H51F021002"].swap(mapPoi);
}

可以兴许可以减少些许不必要的拷贝
乃不知有汉 2012-02-24
  • 打赏
  • 举报
回复
那你就存对象吧
map<CString, map<long,POI_INFO> >
然后拷贝对象
ybin225 2012-02-24
  • 打赏
  • 举报
回复
那我怎么保证m_mapPOI 活着的时候mapPoi也活着呢?把mapPoi声明成全局的吗?如果是全局的,那每次往m_mapPOI中放入mapPoi的时候,mapPoi会保留之前的记录;如果每次把上一次的clear掉,那就保存不了了,这个该怎么解决?
使用迭代器前新判断这个我明白,只是目前处于测试阶段。写的时候没管那么多,多谢指教。
现在的问题是我怎么能使用嵌套的map把我想要的 数据存储起来??
[Quote=引用 1 楼 wangjunsheng 的回复:]

for (...)
{
map<long,POI_INFO> mapPoi;
...
m_mapPOI.insert( pair< CString,map<long,POI_INFO>* >(strMesh,&mapPoi) );
}

严重错误。 m_mapPOI second 指向的是临时对象,m_mapPOI 活着,而 mapPoi 已经死了
你得保证 mapPoi……
[/Quote]
乃不知有汉 2012-02-24
  • 打赏
  • 举报
回复
for (...)
{
map<long,POI_INFO> mapPoi;
...
m_mapPOI.insert( pair< CString,map<long,POI_INFO>* >(strMesh,&mapPoi) );
}

严重错误。 m_mapPOI second 指向的是临时对象,m_mapPOI 活着,而 mapPoi 已经死了
你得保证 mapPoi 在 m_mapPOI 活着的时候也活着

itrMap = m_mapPOI.find("H51F021002");
long nSndsize = itrMap->second->size();
使用迭代器前 先判断
if (itrMap != m_mapPOI.end())
....

你先别急着写代码吧
《c++标准程序库》 你先看看吧
ybin225 2012-02-24
  • 打赏
  • 举报
回复
好吧,多谢指教!
[Quote=引用 8 楼 wangjunsheng 的回复:]

存指针,实际上只存了 4个字节的 地址,指向了你那个对象,
而你那个对象 再下一个for时 已经失效,你不就是野指针了么

存对象,实际上是把整个对象 完整拷贝了一份

swap 很可能可以 通过交换对象的内部几个指针来完成 对象间的交换

PS, 勿在浮沙筑高塔
你还是去看看 侯捷翻译的 那本 C++标准程序库吧
[/Quote]
乃不知有汉 2012-02-24
  • 打赏
  • 举报
回复
存指针,实际上只存了 4个字节的 地址,指向了你那个对象,
而你那个对象 再下一个for时 已经失效,你不就是野指针了么

存对象,实际上是把整个对象 完整拷贝了一份

swap 很可能可以 通过交换对象的内部几个指针来完成 对象间的交换

PS, 勿在浮沙筑高塔
你还是去看看 侯捷翻译的 那本 C++标准程序库吧
super_admi 2012-02-24
  • 打赏
  • 举报
回复
存对象是一种流行趋势。君不见Java和C#都是保存的对象吗?

存指针那都是从C过来的人,如果你不想死太多脑细胞,还是别这么干。

64,654

社区成员

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

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