1. 程式人生 > >map [] 運算符 易出錯點

map [] 運算符 易出錯點

ans [] begin 代碼 訪問 bsp number namespace cnblogs

出錯代碼:

#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 [] 運算符 易出錯點