![](/img/trans.png)
[英]How do you get the max value of a given column of a 2D std::vector?
[英]gdb: how do you get the max value of a std::vector<float>?
我正在调试一些C ++代码,我有一个非常大的std::vector<floating_point_type>
( float
或double
)。 在C ++代码中,当我想要std::vector
的最大值时,我可以使用std::max_element()
。 所以在gdb
我尝试使用相同的代码,但是我收到了一个错误。
在gdb
我使用了call std::max_element(x)
并No symbol "max_element" in namespace "std".
收到错误消息No symbol "max_element" in namespace "std".
有没有办法在gdb
获取向量的最大值?
我还要理解为什么我尝试使用std::max_element
不起作用的原因(也许std::max_element
是一个仅限头文件或内联函数)。
std::max_element
是一个函数模板,而不是函数。 您要求GDB进行模板参数推导,并且整个shebang涉及调用模板函数而不指定参数。 它不能那样做,当然,它不是一个完整的编译器。
据我所知,任何解决方案,从最简单到最复杂,都需要您修改源代码,以便为向量的迭代器类型实例化std::max_element
。 所以你也可以添加“仅调试”代码来计算最大元素并将其存储到局部变量中。
(gdb) p std::max⭾⭾⭾
(没有来自gdb的回复)
(gdb) p std::max_element(v.begin(), v.end())
No symbol "max_element" in namespace "std".
以下是如何从gdb
调用未实例化的函数模板,而不会破坏您的会话并重新编译您的程序。
打开编辑器并创建一个C ++源文件,其中包含所需函数的显式实例化。 例如:
// /tmp/tmpsource.cpp #include <algorithm> #include <vector> using T = std::vector<int>::iterator; template T std::max_element<T>(T, T);
这可以通过shell脚本以某种方式自动化。 给它一个函数和模板参数的名称,它将生成一个完整的可构建C ++源代码。 可能不值得麻烦。
从源构建共享库/ DLL。
g++ -fPIC -shared -ggdb -O0 -o /tmp/libtmpsource.so /tmp/tmpsource.cpp
在调试会话中加载库。
load /tmp/libtmpsource.so # if this doesn't work p dlopen("/tmp/libtmpsource.so", 2) # or perhaps even p LoadLibraryA("c:/temp/libtmpsource.so")
我们现在试试吧。
(gdb) p std::max_element(v.begin(), v.end()) No symbol "max_element" in namespace "std".
什么? 不用担心,一切都在掌控之中。 gdb不是C ++编译器,它不能做模板演绎的事情。 您需要自己指定<...>
。 幸运的是,自动完成工作(有时)。
(gdb) p std::max⭾ (gdb) p std::max_element<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >)
由于std :: max_elemente是一个函数模板,因此不能直接在gdb中使用它。 你可以做什么,在它上面创建一个包装器。
float my_max_element(std::vector<float>& vec)
{
return *(std::max_element(vec.begin(), vec.end());
}
现在你可以在gdb中调用my_max_element。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.