gpt4 book ai didi

c++ - std::map 是如何实现的,所以它可以要求它的 key_type 具有可比性?

转载 作者:IT老高 更新时间:2023-10-28 22:17:16 27 4
gpt4 key购买 nike

这是我对 Box 类的实现:

class Box {
friend ostream& operator<<(ostream &os, const Box &b);
friend bool operator<(const Box &left, const Box &right);
public:
Box(int i, double d);
~Box();
private:
int i;
double d;
};

Box::Box(int _i, double _d):i(_i), d(_d) {}

Box::~Box() {}

bool operator<(const Box &left, const Box &right)
{
return (left.i < right.i);
}

ostream& operator<<(ostream &os, const Box &b)
{
os << b.d;
return os;
}

这是测试代码:

int main()
{
Box b1(3,2), b2(2,1), b3(0, 9);
map<Box, int> bmap;
bmap.insert(pair<Box,int>(b1, 10));
bmap.insert(pair<Box,int>(b2, 10));
bmap.insert(pair<Box,int>(b3, 10));
for (map<Box,int>::iterator iter = bmap.begin(); iter != bmap.end(); ++iter)
{
cout << iter->first << " ";
}
cout << endl;
return 0;
}

如果我删除 Box 类上 operator< 的定义,如果我尝试将 Box 对象插入 std::map,编译器会报错(错误)。

我有一些 Java 经验,我知道在类似的情况下我只需要让 Box 实现 Comarable。而Java编译器会在编译时检查这个契约,因为Java中的Map要求它的key类型符合Comparable。

如果我想在 Java 中定义自己的 map 类型,我只需要编写:

public class MyMap<K extends Comparable<K>, V>

所以我的问题是,如果我想在 C++ 中实现我自己的 map 类型(比如 MyMap),如何定义 MyMap 以便编译器在编译时知道“MyMap 需要它的 key_type 有自己的运算符重载定义<"?

最佳答案

长话短说,您无需做任何事情:编写代码,就像运算符(operator)在那里一样。

与 Java 泛型不同,C++ 模板机制可以不受约束地工作,因为在完全指定所有类参数之前,编译器不需要生成任何代码。相反,Java 编译器必须完全编译类,并在不知道您为 KV 插入的类型的情况下生成最终字节码。

换句话说,C++ 编译器允许您在模板代码中调用任何函数并应用您想要的任何运算符。如果您提供的类具有相应的函数和/或运算符,则模板将毫无问题地编译。如果模板中引用的函数和/或运算符丢失,编译器会给出错误消息。

关于c++ - std::map 是如何实现的,所以它可以要求它的 key_type 具有可比性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com