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

代わりに、3 つの引数を持つ関数を使用し、値のみを比較する両方の反復子と比較オブジェクトを渡します。

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

もう 1 つの方法は、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()は、は でありmap<string, float>::iteratormaxmap.begin()->second実際にはfloat! です。

イテレータではないmax_element2つの参照を関数に与えているため、関数はスローします。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 に答える