当元素插入到的std ::地图探索(discover when the element is ins

2019-07-31 07:40发布

我的节目插入(用[]操作])一些数据[地址]到的std ::地图。 我可以跟踪137 elements.They所有的插入插入与有效值。

在某个阶段,我重复的地图,并尝试做一些操作与值[地址] I`ve设置断点之前,我开始遍历地图。 当我检查调试器的地图我仍然看到137 elements.But,当我重复,直到

iterator != map.end我发现,该地图具有138个值-最后一个是非法的。

我需要找到一种方法来检测时,这最后一个问题的值是inserted.I使用VS 2010。

谢谢

Answer 1:

你可以尝试把条件断点在插入功能std::map

对我来说,(使用VC10),适当的地方是线755(用于std::map::insert )和线767(用于std::map::operator[]的C:\ Program Files文件(x86)的\微软的Visual工作室10.0 \ VC \包括\的XTree

您可以在每个断点添加条件_Mysize == 137捕捉其增加了插入map大小到138。

最有可能的罪魁祸首可能是operator[]因为它很容易让人误认为这是唯一的访问。



Answer 2:

你可以,只是为了调试,更换std::map与隐藏的包装类std::map::insert一个打印出调试信息的成员函数。

#include <map>
#include <iostream>
#include <utility>
#include <string>

template<class Key, 
         class Value, 
         class Compare = std::less<Key>, 
         class Allocator = std::allocator<std::pair<const Key, Value>>>
struct wrap_map : std::map<Key, Value, Compare, Allocator>
{
  typedef std::map<Key, Value, Compare, Allocator> base_type;

  std::pair<iterator,bool> insert( const value_type& value )
  {
    std::cout << "Inserted: [" << value.first << "] : " << value.second << std::endl;
    return base_type::insert( value );
  }
};

int main()
{
  wrap_map<int, std::string> mymap;

  mymap.insert( std::make_pair( 10, std::string( "Hello, World!" ) ) );
  std::cout << mymap[10] << std::endl;
}

输出:

Inserted: [10] : Hello, World!
Hello, World!

你必须创建的任何其他重载过载std::map::insert你用你的代码,并且std::map::operator[]如果你用它来插入元素的地图。

你也可以打印出宏如__LINE__以指示插入正在发生的事情。

需要注意的是std::map没有虚析构函数,所以如果你动态分配的地图,然后用这种方法可能会导致不确定的行为,除非你到处替换类型名称wrap_map



文章来源: discover when the element is inserted to the std::map