Visual Studio调试模式下STL容器的“浅层”显示?

3

我在调试我的C++类时遇到了困难。它是一种图形结构,类似于这样:

class Graph {
    class Node {
        std::map<int, Node>::iterator _neighbors[4];
    };
    std::map<int, Node> _map;
};

基本上,每个节点通过在包含类的映射中存储迭代器来跟踪确切的4个邻居。

问题是,在调试时我尝试在VS2008中显示_map的内容时,会得到类似于这样的结果:

- _map
  - [0]
      first
    - second
      - _neighbors
        - _ptr
            first
          - second
            - _neighbors
              - _ptr
                  first
                - second
                  - _neighbors
                  ...

显然,与其列出地图中索引为0的节点的4个邻居,它会列出它的第一个邻居,然后是第一个邻居的第一个邻居,再是第一个邻居,以此类推。此外,在任何时候都没有将_neighbors作为数组显示,尽管它被声明为数组。

我找到了一个叫做VSEDebug的附加组件,据说具有增强的STL显示功能,但它只适用于VS2k3,并且我无法在2k8中使其工作(无论是二进制文件还是自己编译)。

即时窗口也没有什么帮助,因为尝试调用_map.operator[]会返回CXX0058:错误:找不到重载运算符

有什么想法可以让我获得有意义的地图内容显示吗?请注意,我对整个VS还比较新手,所以可能需要详细的说明。:)


1
可能是重复问题:https://dev59.com/-XVD5IYBdhLWcg3wDXF3 - Ionut Anghelcovici
对我来说,VS 2008 很好地显示了地图。 - sbi
2个回答

3
您可以在命令窗口-立即窗口中输入符号名称并开始跟随其成员指针。例如,如果您调试名为v的std :: vector并想要访问其在位置2处的元素,请键入

*(v._Myfirst + 2)

当然,成员_Myfirst取决于实现方式。但我认为您已经明白了。 (Visual Studio解决操作符重载时存在一些问题)


CXX0017: 错误:找不到符号“_Myfirst”。尝试查找类似的内容,但是VS显示的仅为映射包含的元素。我该如何确定我的实现中所称呼的“_Myfirst”是什么?它是否保证存在? - suszterpatt
你的数据结构中必须有一个内部成员实际上指向该元素。如果你的映射被称为 m,请在命令窗口中输入 m 开始。 - dudewat

1

如果你想的话,可以尝试编写自定义可视化程序,但是你可能会发现自己复制了一些已经存在的功能。以下是一篇介绍基础知识的文章:

http://www.virtualdub.org/blog/pivot/entry.php?id=120

如果您只想查看所有数组元素,可以在快速监视窗口中键入"_map[0].second._neighbors,4"以将其视为四个元素的数组,但这并不是世界上最快的方法。


_map[0] 返回 CXX0058: 错误:未找到重载运算符。dudewat关于VS和运算符的注释似乎是合适的。 - suszterpatt
或者你可以尝试"_map.find(0).second._neighbors,4",但这也不能保证有效(特别是如果没有该键的元素存在)。 - Ron Warholic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接