6

std::map<int, int>デフォルトのソート順ではなく、キーを最高から最低にソートしたいC++で作成しています。私の研究は私をstd::greaterに導きましたが、それは有望に見えましたが、それを使おうとするとコンパイルエラーが発生します:

単項'*'の無効な型引数('int'があります)

私の地図宣言は次のとおりです。

std::map<int, int, std::greater<int> > numMap;

そして、エラーはこの関数からスローされています:

void Row::addNumber(int num, int pos) {
    numMap.insert(num, pos);
}

このような同様の質問への回答には、宣言に括弧が含まれています。つまり、std :: greater ()ですが、これらを含めると、関数が関数を返すことに関して複数のエラーが発生します。

4

2 に答える 2

7

問題–無効なパラメーターを使用したメンバー関数の呼び出しstd::map::insert:2つの整数値が提供されています。しかし、あるに違いありません std::pair<int, int>。参照を参照してください:std :: map::insert

望ましいオプション

便宜上(マップタイプのパラメーターを繰り返さないようにするため)、マップのを作成します。typedef

typedef std::map<int, int> IntMap;

(ペア表現)–のstd::mapタイプ定義があります。したがって、たとえば、ある場合はになります。std::pairstd::map::value_typestd::map<int, int>std::map::value_typestd::pair<int, int>

std::map::value_typeコンストラクターを使用します(IntMap::value_typeこの場合):

class Row {
public:
    void Row::addNumber(int num, int pos)
    {
        m_numMap.insert(IntMap::value_type(num, pos));
    }

private:
    typedef std::map<int, int> IntMap;
    IntMap m_numMap;
};

代替案:

  1. 使用std::make_pair()機能:

    #include <utility>
    
    ...
    
    void Row::addNumber(int num, int pos)
    {
        numMap.insert(std::make_pair(num, pos));
    }
    
  2. std::pairコンストラクターを直接使用します。

    void Row::addNumber(int num, int pos)
    {
        numMap.insert(std::pair<int, int>(num, pos));
    }
    
于 2013-02-16T20:58:41.510 に答える
5

代わりに、セルゲイの答え(これも間違いなく機能します)よりも少し衒学的です。

typedef std::map<int, int, std::greater<int> > MyMap;
MyMap numMap;

void Row::addNumber(int num, int pos)
{
    numMap.insert(MyMap::value_type(num, pos));
}

マップのタイプを変更した場合、後で変更するコードが少なくなるという利点があります。そして、可能性ははるかに低いですが、それでも可能です。実装がから他の何かにstd::map変更された場合(の将来のバージョンで)、その変更に影響されません。value_typestd::pairstl

于 2013-02-16T21:05:56.427 に答える