我有一张地图:
typedef map<string, float> my_map;
my_map maxmap;
我正在尝试找到最大浮点值及其相应的字符串键。这就是我找到最大浮点值的方式,但我遇到了分段错误,也不知道如何找到相应的字符串键。
float max = *(max_element(&(maxmap.begin()->second), &(maxmap.end()->second)));
非常感谢!!
以下函数调用中的参数不是迭代器:
float max = *(max_element(&(maxmap.begin()->second), &(maxmap.end()->second)));
相反,使用带有三个参数的函数,传递两个迭代器和一个比较对象,它只比较值,即:
struct LessBySecond
{
template <typename Lhs, typename Rhs>
bool operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs.second < rhs.second;
}
};
std::max_element(maxmap.begin(), maxmap.end(), LessBySecond());
该函数返回一个迭代器,该迭代器指向具有最大值的元素。
另一种方法是使用来自 boost 或 c++11 的绑定和映射 value_type。我必须说这很难读。
my_map::iterator iter =
max_element( maxmap.begin(), maxmap.end(),
bind(less<float>(),
bind(&my_map::value_type::second, placeholders::_1),
bind(&my_map::value_type::second, placeholders::_2)) );
的参数max_element
必须是迭代器。maxmap.begin()
是一个迭代器,但&maxmap.begin()->second
不是。您不知道这些浮点数存储在内存中的什么位置,并且它们肯定不会连续存储在内存中,因此您可以使用float *
.
您没有max_element
按应有的方式使用。
在您的代码中,maxmap.begin()
是 a map<string, float>::iterator
,所以maxmap.begin()->second
实际上是 a float
!
函数max_element
抛出,因为你给它两个floats
不是迭代器的引用。
要解决您的问题,您应该编写一个Comparator
,然后使用
Comparator myComp;
float max = max_element(maxmap.begin(), maxmap.end(), myComp)->second;
maxmap.end()->second
<-- 您在这里尝试做的是取消引用无效的结束迭代器。
只需使用 for 循环:
typedef my_map::iterator iter;
iter it = maxmap.begin();
iter end = maxmap.end();
float max_value = it->second;
std::string str = it->first;
for( ; it != end; ++it) {
if(*it->second > max_value) {
max_value = it->second;
str = it->first;
}
}