作者回复: 是,也必须满足。标准里明确这么要求了。
如果你传了 less_equal 这样的条件,结果可能是正确,也可能是错误,也可能是程序崩溃。具体发生什么,取决于排序算法的实现。出了问题,就是调用者的锅,不是 sort 的 bug。
以冒泡排序为例,我试了一下,如果是用检验有没有交换来决定是否退出排序,那么,在元素有重复的情况下使用 less_equal 来排序,会导致死循环。
作者回复: 基本正确。
2 实际上还是因为这儿继承真的没啥用。有了泛型,继承基本是种浪费。而且,继承用基类的指针或引用才有用,而C++里的容器类一般都是当值类型来用的。
作者回复: 一,正确。
二,问题还在于C++的值语义。如果你用一个 AbstractMap来访问map和unordered_map,你只能用引用或指针,并不方便。而且,map和unordered_map的模板参数还不一样,通用的话反而成了阉割版……
作者回复: 不是。哈希是哈希,哈希可能有冲突的,相同哈希值也要看键是相同还是不同,来决定是覆盖还是加一项。去看一下数据结构里面的哈希。
作者回复: 哈哈,是这样的。
作者回复: 声明一个模板 hash,其有一个类型参数。编译器知道了 hash 是一个类模板之后,下面才能进行特化。
作者回复: 不会也不可以。这些容器适配器不提供遍历的迭代器就是不允许像你描述这样的任意访问。(迭代器就是广义指针。)
作者回复: 正如错误信息提示的,你的类没有定义相等比较。把定义改成下面这样子就可以了(完整起见,我也加了 != 的定义):
template <typename T>
class Test {
public:
T a_t;
bool operator==(const Test& rhs) const
{
return a_t == rhs.a_t;
}
bool operator!=(const Test& rhs) const
{
return !operator==(rhs);
}
};
作者回复: 超出范围,在此处我们是不在乎的——我们不需要一个正确的数值。哈希值本来就是有冲撞的。
作者回复: 1. 哈,还真是的。典型的拷贝粘贴错误……
2. 想一想,C++ 里到处是半开半闭区间。右界一直是会超出有效范围的。
作者回复: 一、前面正确。关于map错了。可以迭代,并且现在erase已经返回迭代器了(C++98时不行)。
二、跟这个关系不大。OO语言里也是推荐继承接口而不是实现的。
作者回复: 好,基本正确。
作者回复: 1 是激发大家思考,现在多想想就行了。
2 这也算是个点。我再等等其他回答。😊
作者回复: 算是一个点。真要继承,不会更好用,因为容器的接口差异往往很小,这儿多一个,那儿少一个,要多少接口才能表达啊。
作者回复: 我还真希望更新慢点呢,但编辑不肯啊……写文字、造例子都挺花力气的。
第 4、5 讲应该还好吧,烧脑的东西不多。再往下可能会又比较干些,尤其到了模板元编程的部分。
作者回复: 同学动作很快,但有点调皮啊。😄