C++ 过载<;将结构用作映射中的键时未调用运算符?
我知道,当我们使用key as struct时,我们必须为C++ 过载<;将结构用作映射中的键时未调用运算符?,c++,map,operator-overloading,C++,Map,Operator Overloading,我知道,当我们使用key as struct时,我们必须为
struct Node
{
int a;
};
// This is not called
bool operator< (const Node &p_node1,const Node &p_node2)
{
printf("\nCALLED OPERATOR OVERLOADING");
return true;
}
int main()
{
using namespace std;
map<Node,int> my_map;
Node n1;
n1.a=55;
my_map[n1]=2; // operator overloading should be called
return 0;
}
struct节点
{
INTA;
};
//这不叫
布尔运算符<(常数节点和p_节点1、常数节点和p_节点2)
{
printf(“\n调用运算符重载”);
返回true;
}
int main()
{
使用名称空间std;
绘制我的地图;
节点n1;
n1.a=55;
my_map[n1]=2;//应调用运算符重载
返回0;
}
问题是没有调用运算符重载函数
编辑:
从下面的答案来看,在向容器添加一对之后,将调用重载操作符。
但是为什么它被称为三次,这里比较什么呢 当映射为空时,不需要调用比较器,因为没有可比较的对象。在空映射中插入唯一的元素,因此不会调用比较运算符。尝试在
my\u map
中包含多个元素 映射中至少有2个元素用于调用比较运算符
Node n1;
n1.a=55;
my_map[n1]=2; // operator overloading should be called
Node n2;
n2.a=55;
my_map[n2]=3;
请参见下面修改的示例代码
你是对的。在向容器中再添加一对之后,重载运算符函数<将被调用三次。幕后是什么?在我的测试中,它只使用了一次。映射内部是一个二叉搜索树,因此,每次比较都应该将搜索指向树的一侧或另一侧。在一般情况下,在查找(或不查找)要查找的元素之前,应该进行log2(N)比较(其中N是映射中的元素数)。在这里它也被称为三次,我在使用Clang3.3(使用shiva kumar代码),它只比较了一次