2015-05-22 84 views
1

在我的項目中,我想將鍵插入地圖。所有新的密鑰應該得到的值1.0,但現有的密鑰應增加1。檢查地圖中是否存在關鍵字,然後更新值

下面的代碼

vector <string> pairs; 
map<string, float> two; 
map <string, float>::iterator it; 

string a = "a"; 
string b = "b"; 
string c = "a"; 

pairs.push_back(a); 
pairs.push_back(b); 
pairs.push_back(c); 

for(int i=0; i<pairs.size(); i++) 
{ 
    it = two.find(string(pairs[i])); 
    if(i==0) 
    { 
     two[string(pairs[i])]=1.0; 
    } 
    else if (it == two.end()) 
    { 
     it->second = it->second + 1.0; 
    //after this line ^,my compiler stop working 
    } 
    else 
    { 
     two[string(pairs[i])]=1.0; 
    } 
} 

在此之後,對象應該是

a 2 
b 1 

我該怎麼辦所以。

回答

1
else if (it == two.end()) 
    { 
     it->second = it->second + 1.0; 

上面的代碼行需要更正如下比

else if (it != two.end()) 
      ^^^ 
    { 
     it->second = it->second + 1.0; 

更多:

it = two.find(string(pairs[i])); 

上述行可以重寫如下

it = two.find(pairs[i]); 
+1

非常感謝,現在它的工作原理就像它應該工作:)! – theCember

0

應該有吧!= two.end(),而不是它== two.end()

我覺得也是第一個條件(i == 0)檢查可以跳過

1

STL的設計要有效地做到這一點,並看看如何。

但首先,請注意,在你的代碼,該行

two.find(string(pairs[i])); 

two[string(pairs[i])]=1.0; 

執行查找,這是一個有點浪費。

如果您查看signature for map::insert,則可以看到返回值爲std::pair<iterator, bool>。第二個是指示元素是否實際插入的布爾值。第一個是前一個元素的迭代器(如果它存在,在這種情況下它不會被覆蓋)或新元素。

因此,要有效地做到這一點的方法是寫

auto ins = two.insert(make_pair(pairs[i], 0)); 
ins.first->second += 1; 
1

最簡單,最有效的解決方案是:

for (auto const& s : pairs) two[s] += 1.0; 

這工作,因爲[]操作者在地圖上自動創建,如果一個條目該鍵不存在,使用默認值構造函數。對於浮點數,默認的構造函數產生一個0.0。

由於[]返回一個引用,因此不會進行額外的查找以增加該值。

相關問題