Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 过载<;将结构用作映射中的键时未调用运算符?_C++_Map_Operator Overloading - Fatal编程技术网

C++ 过载<;将结构用作映射中的键时未调用运算符?

C++ 过载<;将结构用作映射中的键时未调用运算符?,c++,map,operator-overloading,C++,Map,Operator Overloading,我知道,当我们使用key as struct时,我们必须为

我知道,当我们使用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代码),它只比较了一次