【问题标题】:What is the difference between if(map[arr[i]]) and if (map.find(arr[i]) != map.end()) ? When looking for a value in the mapif(map[arr[i]]) 和 if (map.find(arr[i]) != map.end()) 有什么区别?在地图中查找值时
【发布时间】:2022-02-04 06:34:12
【问题描述】:

任务是找到公共子字符串。当我更改我的 if 语句时,该解决方案有效。那么 ->>>>> if(map.find(...) != map.end()) 和 if(map[a..[..]]) 有什么区别?

正确代码:

 unordered_map<char, int> map;   

for(int i = 0; i < s1.size(); i++)        
    map[s1[i]]++;   
             *emphasized text*
  for(int i = 0; i < s2.size(); i++)        
    if(map[s2[i]])            
      return \"YES\"; 
       
  return \"NO\";
}
  • *emphasized text* 不是有效的 C++。贴出真实代码。

标签: c++ maps


【解决方案1】:

该行:

 if(map.find(X) != map.end())

检查X 是否存在于地图中,如果存在则返回true(从而输入您的测试条件)。

该行:

if(map[<X>])

如果地图中存在X,那么它将返回关联的值。如果映射中不存在X,则将插入它并构造一个默认值,并将其作为operator[] 的结果。它是operator[] 返回的值,然后将其转换为布尔值以决定是否采用分支。

两者的区别:

  • if(map.find(X) != map.end())
    不改变地图。
    如果项目 &lt;X&gt; 存在于地图中,则分支。
  • if(map[&lt;X&gt;])
    如果键 'X' 不存在,则改变地图。
    分支取决于与键 X 关联的值。
    注意:默认构造值并不总是评估为 false,它取决于类型。尽管在您的情况下 unordered_map&lt;char, int&gt; map; 值类型是 int 并且整数的默认值(或映射中的默认值构造对象)是 0,因此转换为 false。

【讨论】:

    【解决方案2】:

    一个区别是if(map[s2[i]]) 将在map 中为该键插入一个0。副作用是后续的if(map.find(...) != map.end()) 会找到0 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2023-01-22
      • 2011-07-26
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多