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
给定一个目标 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