我想使用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 ++都很陌生。
如何在地图中使用一对作为关键字?一般来说,如何将任何类型的结构(对象,结构等)用作地图中的键?
谢谢!
答案 0 :(得分:28)
std::map::insert
只接受一个参数:键值对,因此您需要使用:
mapa.insert(std::make_pair(p1, "Manzana"));
您应该在类型中使用std::string
而不是C字符串。就像现在一样,你可能无法得到你期望的结果,因为在地图中查找值将通过比较指针来完成,而不是通过比较字符串。
如果你真的想要使用C字符串(你不应该这样做),那么你需要在你的类型中使用const char*
而不是char*
。
总的来说,我如何使用任何类型的结构(对象,结构等)作为地图中的键?
您需要为密钥类型重载operator<
或使用自定义比较器。
答案 1 :(得分:6)
这是对相关代码的重写:
#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;
}
答案 2 :(得分:5)
詹姆斯麦克尼利斯所说的话:
mapa.insert(std::make_pair(p1, "Manzana"));
您可以使用mapa.insert({p1, "Manzana"});
答案 3 :(得分:0)
这是您想要执行的操作的类似版本,仅更改数据类型即可。另外,请使用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));
}
答案 4 :(得分:0)
std::map::emplace 是您的朋友。
mapa.emplace(p1, "Manzana");
答案 5 :(得分:-1)
这将完全符合您的要求
+---------+ +-----+
| ---|----------------->| |
+---------+ +-----+
x y