#include <iostream>
int main() {
std::hash<int> hash_f;
std::cout << hash_f(0) << std::endl;
std::cout << hash_f(1) << std::endl;
std::cout << hash_f(2) << std::endl;
std::cout << hash_f(3) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我用"g ++ main.cpp -std = c ++ 11"编译,结果是:
0
1
2
3
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我不使用任何库,我没有专门的散列函数.
附录:我想为int的unordered_set的unordered_set定义散列,其中集合的散列是其组件散列的总和,但如果它只是标识它并不酷,因为{2,4}的散列是相同的{1,5}的哈希值.避免这种情况的最简单方法可能是使用std :: hash double函数.
这是我的代码:
b = f() || b;
Run Code Online (Sandbox Code Playgroud)
该功能f()有副作用,必须始终执行.通常,只有正确的操作数可以短路,这个代码应该可以工作.但是我担心一些编译器会反转两个操作数,因为短路功能评估而不是简单的变量评估会更有效.我知道g ++ -O3可以破坏一些规范,但我不知道这个代码是否会受到影响.
那么,我的代码是否没有风险?
我知道是否要求短路逻辑运算符?和评估顺序?但我的问题是关于编译器优化,我不知道他们不能打破标准(即使这会很奇怪).
例如,如果我的地图是从整数到双精度并且包含:
当我搜索4时,我必须得到87.3,因为3是地图中最近的小键.当我搜索11时,我必须获得0.0.
这可以通过平衡树来完成.但我不希望实现一个平衡的树,可能有一种方法直接使用STL吗?
下面的代码不正确,我理解为什么,get_point返回类在类外未知的值:
class C {
typedef std::pair<double, double> Point;
public:
Point get_point() const;
};
Point C::get_point() const {
[...]
}
Run Code Online (Sandbox Code Playgroud)
但为什么下面的代码不正确呢?课堂外没有使用本地类型!
class C {
typedef std::pair<double, double> Point;
private:
Point get_point() const;
};
Point C::get_point() const {
[...]
}
Run Code Online (Sandbox Code Playgroud)
当我们使用时,C::我们应该在课堂内,所以我们应该可以使用Point!
c++ ×4
c++11 ×1
compilation ×1
debugging ×1
dictionary ×1
identity ×1
private ×1
return-value ×1
stdhash ×1
stl ×1
tree ×1
typedef ×1