小编Fra*_*ois的帖子

为什么std :: hash <int>似乎是身份函数

#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函数.

c++ debugging identity c++11 stdhash

9
推荐指数
3
解决办法
3582
查看次数

C++编译器优化和短路评估

这是我的代码:

b = f() || b;
Run Code Online (Sandbox Code Playgroud)

该功能f()有副作用,必须始终执行.通常,只有正确的操作数可以短路,这个代码应该可以工作.但是我担心一些编译器会反转两个操作数,因为短路功能评估而不是简单的变量评估会更有效.我知道g ++ -O3可以破坏一些规范,但我不知道这个代码是否会受到影响.

那么,我的代码是否没有风险?

我知道是否要求短路逻辑运算符?和评估顺序?但我的问题是关于编译器优化,我不知道他们不能打破标准(即使这会很奇怪).

c++ compilation short-circuiting

7
推荐指数
2
解决办法
563
查看次数

如何调整地图以找到最近的较小物体?

例如,如果我的地图是从整数到双精度并且包含:

  • 2 - > 3.4
  • 3 - > 87.3
  • 5 - > 0.0
  • 12 - > 43.4

当我搜索4时,我必须得到87.3,因为3是地图中最近的小键.当我搜索11时,我必须获得0.0.

这可以通过平衡树来完成.但我不希望实现一个平衡的树,可能有一种方法直接使用STL吗?

c++ tree dictionary stl

3
推荐指数
1
解决办法
60
查看次数

C++:私有方法返回的本地typedef

下面的代码不正确,我理解为什么,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++ typedef private return-value

2
推荐指数
1
解决办法
584
查看次数