map [] 运算符 易出错点

Posted dy blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了map [] 运算符 易出错点相关的知识,希望对你有一定的参考价值。

出错代码:

#include<bits/stdc++.h>
using namespace std;
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
    vector<int>ans;
    map<int,int>mp;
    for(int i=0;i<array.size();i++) mp[array[i]]++;
    for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++) {
            if(mp[sum - it->first] >= (sum == it->first + it->first) + 1) {
                    ans.push_back(it->first),ans.push_back(sum-it->first);
                    break;
            }
    }
    return ans;
}
int main() {
    vector<int> a = {1,2,4,7,11,16};
    vector<int> ans = FindNumbersWithSum(a,10);
    if(ans.size()) printf("[%d,%d]\n",ans[0],ans[1]);
    else printf("[]\n");
}
//结果为[6,4]

修改后:

#include<bits/stdc++.h>
using namespace std;
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
    vector<int>ans;
    map<int,int>mp;
    for(int i=0;i<array.size();i++) mp[array[i]]++;
    for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++) {
            if(mp.find(sum - it->first)->second >= (sum == it->first + it->first) + 1) {
                    ans.push_back(it->first),ans.push_back(sum-it->first);
                    break;
            }
    }
    return ans;
}
int main() {
    vector<int> a = {1,2,4,7,11,16};
    vector<int> ans = FindNumbersWithSum(a,10);
    if(ans.size()) printf("[%d,%d]\n",ans[0],ans[1]);
    else printf("[]\n");
}
//结果为[]
mp[sum - it->first] 这样访问时若key为6,但原来没有这个key,则会插入一个数据(6,0)到map中,然后it遍历到6的时候找到了4,输出[6,4]
但使用
mp.find(sum - it->first)->second
不会插入新的数据

所以有时候就算知道[]运算符在key不存在时会插入数据,但有时候产生的后果是意想不到的,所以只是查找的话尽量用find函数,不要贪图方便

 

以上是关于map [] 运算符 易出错点的主要内容,如果未能解决你的问题,请参考以下文章

易出错的代码整理

总结了一些指针易出错的常见问题

jQuery选择器与JavaScript易出错知识点

在片段中创建自定义列表视图时出错。必需的活动,找到的片段

使用片段从数据库 SQLite 获取数据时出错

在片段中创建自定义列表视图时出错所需活动,找到片段