-2

我有一张地图:

typedef map<string, float> my_map;
my_map maxmap;

我正在尝试找到最大浮点值及其相应的字符串键。这就是我找到最大浮点值的方式,但我遇到了分段错误,也不知道如何找到相应的字符串键。

float max = *(max_element(&(maxmap.begin()->second), &(maxmap.end()->second)));

非常感谢!!

4

5 回答 5

4

以下函数调用中的参数不是迭代器:

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());

该函数返回一个迭代器,该迭代器指向具有最大值的元素。

于 2012-10-25T20:06:51.803 回答
3

另一种方法是使用来自 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)) );
于 2012-10-25T21:53:24.903 回答
2

的参数max_element必须是迭代器。maxmap.begin()是一个迭代器,但&maxmap.begin()->second不是。您不知道这些浮点数存储在内存中的什么位置,并且它们肯定不会连续存储在内存中,因此您可以使用float *.

于 2012-10-25T20:07:48.857 回答
2

您没有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;
于 2012-10-25T20:08:53.067 回答
0

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;
    }
}
于 2012-10-25T20:12:42.203 回答