当我编译以下代码时,我看到了与哈希相关的错误。

int F_no_meaningA(unordered_set<vector<int>>& setVec, vector<int>& vec)
{
    setVec.insert(vec);
    return 1;
}

int main()
{
  vector<int> W{2, 3, 7};
  unordered_set<vector<int>> setVec;
}

$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

$ g++ $1.cpp -o $1 -g -Wall -Weffc++ -pedantic -std=c++0x



然后,我介绍以下自己的Hash并解决了问题。

问题1 >我们什么时候应该为std::unordered_set提供我们自己的哈希?
我们什么时候应该为std::unordered_set提供我们自己的等效函数?
struct HashVector : unary_function<vector<int>, vector<int>::size_type> {
  vector<int>::size_type operator()(const vector<int>& vec) const {
    vector<int>::size_type sum = 0;
    for(int i : vec) {
      sum = sum*37 + hash<int>()(i);
    }
    return sum;
  }
};

int F_no_meaningB(unordered_set<vector<int>, HashVector>& setVec, vector<int>& vec)
{
    setVec.insert(vec);
    return 1;
}

int main()
{
  vector<int> W{2, 3, 7};
  unordered_set<vector<int>, HashVector> setVec;
}



问题2 >为什么带有上述警告的g++提示struct HashVector?

谢谢

最佳答案



当您使用的类型没有标准库提供的哈希值时。例如,它不为标准容器提供哈希函数,包括vector<int>



因为您已经使用-Weffc++请求了一个(稍微过分热心的)警告,以便在您从没有虚拟析构函数的类继承时告诉您。对于继承的大多数用途(即用于多态),您都不想这样做。但是,在这种情况下,仅使用继承(或者有人说滥用)将某些定义注入(inject)到类中,因此警告并不表示存在问题。

不赞成使用std::unary_function之类的类,因此最好的解决方案是根本不要继承它。

09-10 00:59
查看更多