Использование пары в качестве ключа на карте (C ++ / STL) - PullRequest
30 голосов
/ 19 июля 2010

Я хочу использовать пару из 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 ++.

Как я могу использовать пару в качестве ключа на карте?И вообще Как я могу использовать любую структуру (объекты, структуры и т. Д.) В качестве ключа на карте?

Спасибо!

Ответы [ 5 ]

28 голосов
/ 19 июля 2010

std::map::insert принимает один аргумент: пара ключ-значение, поэтому вам нужно будет использовать:

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

Вы должны использовать std::string вместо строк C в ваших типах. Как и сейчас, вы, скорее всего, не получите ожидаемых результатов, потому что поиск значений на карте будет выполняться путем сравнения указателей, а не сравнения строк.

Если вы действительно хотите использовать строки C (что, опять же, не следует), тогда вам нужно использовать const char* вместо char* в ваших типах.

И вообще, как я могу использовать любую структуру (объекты, структуры и т. Д.) В качестве ключа на карте?

Вам необходимо перегрузить operator< для типа ключа или использовать собственный компаратор.

6 голосов
/ 11 января 2011

Вот рабочая переписка рассматриваемого кода:

#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;
}
5 голосов
/ 09 декабря 2015

В качестве альтернативы тому, что сказал Джеймс Макнеллис:

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

вы можете использовать mapa.insert({p1, "Manzana"});

0 голосов
/ 09 апреля 2019

Это похожая версия того, что вы хотите сделать, просто измените типы данных, вот и все.Кроме того, используйте строку 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 голосов
/ 10 марта 2018

Это будет делать именно то, что вы хотите

#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<pair<string, long long int>, string> MAP;
    pair<string, long long int> P;
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Apple", 45), "Manzana"));
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Berry", 20), "Arandano"));
    P = make_pair("Berry", 20);
    //to find berry, 20
    cout<<MAP[P]<<"\n";
    return 0;
}
...