C++ 映射不删除元素

C++ map not deleting elements

给定一个目标 K 和一个不同元素的数组,任务是从数组中删除总和为 K 的所有对。

这是我遵循的方法

for(i=0;i<N;i++)
    cin>>array[i];
cin>>K;
map<int, int> mp;
for(i=0;i<N;i++)
{
    if(mp.find(array[i])==mp.end())
        mp[array[i]] = 1;
    else
        mp[array[i]]++;
}

删除逻辑

for(i=0;i<N;i++)
{
   if(mp[K-array[i]]>0)
   {            
       mp.erase(K-array[i]);
       mp.erase(array[i]);
    }
}

打印输出:

cout<<mp.size();

输入:

array = 6 5 4 2 1 0
K = 6

程序输出

4

预期输出

0
if(mp[K-array[i]]>0)

std::map::operator::[] 如果元素不存在则添加

您必须像下面这样找到并删除:

for(int i=0;i<N;i++)
{
   if(mp.find(K-array[i]) != mp.end()  && 
      K-array[i] != array[i])
      //~~~~~~~~~~~~~~~~~~~~~ check required to see k/2 = array[i]
      // Note: all numbers are distinct 
   { 
       mp.erase(K-array[i]);
       mp.erase(array[i]);
   }
}

更好的策略是在使用 std::unordered_set

扫描期间使用删除元素
std::unordered_set<int> s;

for(const auto& ele: array) {
    auto it =  s.find( K - ele);
    if ( it == s.end() ) {
     s.insert(ele);   
    } else {
        s.erase(it);
    }
}

std::cout << s.size();

here