9

对于调试,我需要查看地图(std::unordered_mapstd::map)的内容,Eclipse CDT 调试器没有以可读的形式提供给我,例如{1: 2, 3:4, ...}

在调试时检查地图内容的最佳方法是什么?

我必须回到使用打印语句进行调试吗?如果是,那么简洁的宏或函数将如何将任何地图的内容打印为字符串?

4

2 回答 2

1

GDB 可以用Python进行扩展,并且有一个用于漂亮打印的 API 。

许多漂亮的 C++ 打印机可用,例如这台

于 2012-12-17T10:42:51.137 回答
1

我必须回到使用打印语句进行调试吗?如果是,那么简洁的宏或函数将如何将任何地图的内容打印为字符串?

我不知道你是否这样做 - 我不使用 Eclipse,但打印地图非常容易:

template <typename K, typename V>
std::ostream& operator<<(std::ostream& os, const std::map<K, V>& m)
{
    os << "{ ";
    for (typename std::map<K, V>::const_iterator i = m.begin(); i != m.end(); ++i)
    {
        if (i != m.begin()) os << ", ";
        os << i->first << ": " << i->second;
    }
    return os << " }";
}

然后你就可以使用<< my_map. 请注意,尽管在大型代码库中,其他人可能会有相同的“聪明”想法,因此您可能希望将您的辅助函数放在您自己的命名空间中,或者给它一个更本地化的名称。诸如周围"{ "和分隔符的选择是任意的" }"", "可能并不适合所有用户 - 有些人可能想要自动字符串引用/转义等,所以在最好的情况下将它放在全局命名空间中是可疑的,在这种情况下它甚至可能被保留以备将来可能包含在 C++ 标准或其他东西中——毕竟,它有点喜欢将您自己的名字添加到std::命名空间中。如果您关心,请检查标准。

于 2012-12-17T10:32:18.723 回答