Использование пары в качестве ключа на карте (С++/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 и С++.
Как я могу использовать пару в качестве ключа на карте? И вообще Как я могу использовать любую структуру (объекты, структуры и т.д.) В качестве ключа на карте?
Спасибо!
Ответы
Ответ 1
std::map::insert
принимает один аргумент: пара ключ-значение, поэтому вам нужно будет использовать:
mapa.insert(std::make_pair(p1, "Manzana"));
Вы должны использовать std::string
вместо строк C в своих типах. Как и сейчас, вы, скорее всего, не получите ожидаемых результатов, потому что поиск значений на карте будет сделан путем сравнения указателей, а не путем сравнения строк.
Если вы действительно хотите использовать строки C (что вам опять же не нужно), вам нужно использовать const char*
вместо char*
в ваших типах.
И вообще Как я могу использовать любую структуру (объекты, структуры и т.д.) в качестве ключа на карте?
Вам нужно перегрузить operator<
для типа ключа или использовать пользовательский компаратор.
Ответ 2
Здесь рабочий переработчик кода, о котором идет речь:
#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;
}
Ответ 3
В качестве альтернативы тому, что сказал Джеймс Макнеллис:
mapa.insert(std::make_pair(p1, "Manzana"));
вы можете использовать mapa.insert({p1, "Manzana"});
Ответ 4
Это похожая версия того, что вы хотите сделать, просто измените типы данных, вот и все. Также используйте строку 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));
}
Ответ 5
Никогда не используйте это для решения конкурентного программирования. Потому что я считаю, что его сложность выше, чем log (n). Так что подумайте об альтернативе..
Ответ 6
Это будет делать именно то, что вы хотите
#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;
}