【问题标题】:accessing value in map of maps访问地图地图中的值
【发布时间】:2014-08-27 01:23:04
【问题描述】:
typedef std::vector<UCHAR> RESPONSE_BUFFER;
typedef TimedHashMap<int, RESPONSE_BUFFER*> TimeResponseHashMap;

内部映射原型将“整数”作为键,将“指向字符向量的指针”作为映射值。

TimeResponseHashMap* inner_pending_response_map;

外地图是地图的地图。它以“整数”作为键,以“指向内部映射的指针”作为映射值。

std::map<int, TimeResponseHashMap* > outer_pending_response_map;

我这样插入: 内部地图是用户定义的地图,因此它具有不同的格式。

inner_pending_response_map->Insert((int)s16MessageID, &resp_buffer, expirytime);

outer_pending_response_map.insert(make_pair((int)s16SessionID,       
    inner_pending_response_map));

TimeResponseHashMap 提供用户定义的接口“查找”来访问地图的成员。

template <typename Key, typename ElementObject>
THM_ERROR TimedHashMap<Key, ElementObject>::Find(const Key& k, ElementObject& e)
{

    typename hash_map<Key, BaseElement_*, dw_hash<Key>, dw_equal_to<Key> >::iterator itr;
    try
    {
        itr = h_->find(k);
    } catch ( ... )
    {
        return E_INTERNAL_ERROR;
    }

    if ( itr == h_->end() )
    {
        e = NULL;
        return E_ITEM_NOT_FOUND;
    }

    e = itr->second->e_;
    return E_SUCCESS;
}

我有两个键,现在我需要访问内部映射的“映射值”。内部地图使用上面的 Find() 函数进行搜索。我需要将 RESPONSE_BUFFER 变量作为第二个参数传递给 Find() 函数。

我正在尝试这样提取,但输出错误:

RESPONSE_BUFFER resp_buffer;
ExtractFragmentResponse(u16Key1, u16Key2, &resp_buffer);

ExtractFragmentResponse 的定义如下:

STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID, 
RESPONSE_BUFFER* resp)
{
      (((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}

resp 没有给我正确的数据。 怎么办?

【问题讨论】:

  • TimedHashMap提供什么接口?
  • 我已经为 TimedHashMap 接口添加了代码
  • 我需要将“RESPONSE_BUFFER *buff”变量作为参数传递给 ExtractFragmentResponse 函数。
  • @user1124236 一个建议是将一行分成几行。然后你应该能够弄清楚需要做什么。
  • @user1124236 - 我的建议可能需要将该行分成几行。您假设外部 find 函数实际上找到了一些东西。 outer_pending_response_map.find(u16SessionID) 如果不是,那么当您将 -&gt;second 应用于此虚假值时,您将取消对无效迭代器的引用。

标签: c++ pointers maps std


【解决方案1】:

这可能不能直接回答问题,但它确实说明了为什么使用的代码有很大的错误,应该分成几行。

STATUS
C_THREAD::ExtractFragmentResponse(USHORT u16SessionID, USHORT u16MessageID, 
RESPONSE_BUFFER* resp)
{
  (((outer_pending_response_map.find(u16SessionID))->second)->Find((int)u16MessageID, resp))
}

假设这确实“有效”。无论如何,它有一个大问题。问题是这样的:

outer_pending_response_map.find(u16SessionID)

如果find 找不到条目u16SessionID 会怎样?您现在已被退回outer_pending_response_map.end()。当这个返回值被这样使用时:

outer_pending_response_map.end()-&gt;second

繁荣,你死了。该行尝试使用无效的迭代器,这是未定义的行为。

你应该这样做:

 std::map<int, TimeResponseHashMap* >::iterator it1 = outer_pending_response_map.find(u16SessionID);
 if ( it1 != outer_pending_response_map.end())
     (it1->second)->Find((int)u16MessageID, resp);
 else
 {
    // you  fill in what happens if the find fails
 }

为了调试您的问题,您可以进一步分解线路以确保您得到的内容是有效的:

 std::map<int, TimeResponseHashMap* >::iterator it1 = outer_pending_response_map.find(u16SessionID);
 if ( it1 != outer_pending_response_map.end())
 {
     TimeResponseHashMap *theMap = it1->second;
     theMap->Find((int)u16MessageID, resp);
 } 
 else
 {
    // you  fill in what happens if the find fails
 }

上面的代码将it1-&gt;second 保存为一个值(theMap),您可以轻松检查它是否正确。

【讨论】:

  • 感谢您的详细解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2021-02-07
  • 2020-12-30
相关资源
最近更新 更多