gpt4 book ai didi

c++ - size_t : an operator?(以及使用 unordered_set 的方法)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:30 24 4
gpt4 key购买 nike

什么是

operator size_t () const

环境:Visual Studio 2010 Professional


TL;恢复

今天我正在寻找一种使用 std::tr1::unordered_set 的方法。因为我问了 how to use std::map上次,我决定自己找出来。

我用谷歌搜索,大部分结果告诉我有一个结构来进行散列。这条路对我来说有点复杂,我一直在寻找,终于找到了另一种方法。

我需要实现

bool operator == (const edge & another) const

operator size_t () const

生成的代码接近问题的结尾。

== 很熟悉,没有任何问题。 size_t也很熟悉。但是什么是operator size_t

好像是Java的equalshashCode,根据Effective Java需要一起覆盖。但我不确定,尤其是当名称为 size_t 时。


结果代码如下。完整的程序运行良好,并产生正确的输出。

class edge {
public:
int x;
int y;
edge(int _x, int _y) : x(_x), y(_y) {
}
bool operator == (const edge & another) const {
return (x == another.x && y == another.y);
}
operator size_t () const {
return x * 31 + y;
}
};

还有一点:

不是

size_t operator () const

无法编译:

error C2143: syntax error : missing ';' before 'const'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2059: syntax error : '{'
error C2334: unexpected token(s) preceding '{'; skipping apparent function body

甚至没有

int operator size_t () const

但正如我所见,该函数返回 int。错误代码如下:

error C2549: user-defined conversion cannot specify a return type

最佳答案

这是type cast operator .基本上提供了将对象隐式转换为指定类型的功能,在本例中为 size_t .

编辑:

假设您有一个定义如下的函数:

void Foo( size_t x )
{
// do something with x
}

如果你的类(class)edge定义转换为 size_t 的类型转换运算符您可以执行以下操作:

edge e;
Foo( e );

编译器会自动转换edge反对 size_t .正如@litb 在评论部分所说,不要这样做。隐式转换允许编译器在您可能不希望发生这种情况时执行转换,从而导致麻烦。

您应该改为定义一个成员函数,例如 edge::to_size_t() (我知道这是一个糟糕的名字)来执行转换。

例如,std::string定义 std::string::c_str()成员函数而不是定义类型转换运算符以转换为 const char * .

编辑 2:抱歉,我没有仔细阅读您的问题。现在我看到你正试图在 std::unordered_set 中使用你的类.在那种情况下,您应该定义为您的类执行散列和比较操作的仿函数。或者,您可以提供 std::hash 的模板特化和 std::equal_to为您的类创建 unordered_set 时不必指定可选模板参数对象。

正如您在问题中所问的,这与 Java 的 hashCode() 非常相似。成员函数,但由于 C++ 类并不像 Java 类一样都派生自公共(public)基类,因此它没有实现为可覆盖的基类函数。

关于c++ - size_t : an operator?(以及使用 unordered_set 的方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6585077/

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