web-dev-qa-db-ja.com

マップでキーとしてペアを使用する(C ++ / STL)

STLのペアをマップのキーとして使用します。

#include <iostream>
#include <map>

using namespace std;

int main() {

typedef pair<char*, int> Key;
typedef map< Key , char*> Mapa;

Key p1 ("Apple", 45);
Key p2 ("Berry", 20);

Mapa mapa;

mapa.insert(p1, "Manzana");
mapa.insert(p2, "Arandano");

return 0;

}

しかし、コンパイラーは読み取り不能な情報を大量に投げてしまいます。私はCとC++を初めて使います。

ペアをマップのキーとして使用するにはどうすればよいですか?そして一般的に、マップ内のキーとしてどのような種類の構造(オブジェクト、構造など)を使用できますか?

ありがとう!

31
ccarpenterg

std::map::insertは単一の引数(キーと値のペア)を取るため、以下を使用する必要があります。

mapa.insert(std::make_pair(p1, "Manzana"));

型では、C文字列の代わりにstd::stringを使用する必要があります。現在のように、マップ内の値の検索は文字列の比較ではなく、ポインターの比較によって行われるため、期待する結果が得られない可能性があります。

本当にC文字列を使用したい場合(これも使用すべきではありません)、タイプでconst char*の代わりにchar*を使用する必要があります。

そして一般的に、どのような種類の構造(オブジェクト、構造など)をマップのキーとして使用できますか?

キータイプのoperator<をオーバーロードするか、カスタムコンパレーターを使用する必要があります。

28
James McNellis

問題のコードを実際に書き直したものを次に示します。

#include <map>
#include <string>

class Key
{
  public: 
    Key(std::string s, int i)
    {
      this->s = s;
      this->i = i;
    }
    std::string s;
    int i;
    bool operator<(const Key& k) const
    {
      int s_cmp = this->s.compare(k.s);
      if(s_cmp == 0)
      {
        return this->i < k.i;
      }
      return s_cmp < 0;
    }
};

int main()
{


  Key p1 ("Apple", 45);
  Key p2 ("Berry", 20);

  std::map<Key,std::string> mapa;

  mapa[p1] = "Manzana";
  mapa[p2] = "Arandano";

  printf("mapa[%s,%d] --> %s\n",
    p1.s.c_str(),p1.i,mapa.begin()->second.c_str());
  printf("mapa[%s,%d] --> %s\n",
    p2.s.c_str(),p2.i,(++mapa.begin())->second.c_str());

  return 0;
}
6
Alec Jacobson

James McNellisが述べたことの代わりに:

_mapa.insert(std::make_pair(p1, "Manzana"));
_

mapa.insert({p1, "Manzana"});を使用できます

5
Julian Declercq

これは、あなたがやりたいことの類似したバージョンであり、データ型を変更するだけです。また、cで使用する文字列ではなく、c ++文字列を使用します。

#include<bits/stdc++.h>
using namespace std;
#define  ll long long int
typedef pair<ll,ll> my_key_type;
typedef map<my_key_type,ll> my_map_type;
int  main()
{
    my_map_type m;
    m.insert(make_pair(my_key_type(30,40),6));
}   
0
Kumar Utkarsh