2012-01-24 138 views
4

如果將其插入到來自不同範圍的地圖中,是否需要分配一對?是堆棧或堆make_pair?

#include <iostream> 
#include <string> 
#include <unordered_map> 
#include <utility> 

using namespace std; 
void parseInput(int argc, char *argv[], unordered_map<string, string>* inputs); 

int main(int argc, char *argv[]) 
{ 
    unordered_map<string, string>* inputs = new unordered_map<string, string>; 
    parseInput(argc, argv, inputs); 
    for(auto& it : *inputs){ 
     cout << "Key: " << it.first << " Value: " << it.second << endl; 
    } 
    return 0; 
} 

void parseInput(int argc, char *argv[], unordered_map<string, string>* inputs) 
{ 
    int i; 
    for(i=1; i<argc; i++){ 
     char *arg = argv[i]; 
     string param = string(arg); 
     long pos = param.find_first_of("="); 
     if(pos != string::npos){ 
      string key = param.substr(0, pos); 
      string value = param.substr(pos+1, param.length()-pos); 
      inputs->insert(make_pair(key, value));//what happens when this goes out of scope 
     } 
    } 
    for(auto& it : *inputs){ 
     cout << "Key: " << it.first << " Value: " << it.second << endl; 
    } 
} 
+2

你爲什麼要創建具有'new'的'unordered_map'?爲什麼不只是'unordered_map 輸入;'? – Mankarse

+1

您想重新考慮動態創建指針輸入。一個對象通常更合適。 –

回答

4

其優良:

inputs->insert(make_pair(key, value));//what happens when this goes out of scope 

的std :: make_pair按值返回結果。

以上是一樣的影響:

inputs->insert(std::pair<std::string, std::string>(key, value)); 

在兩種情況下傳遞給插入()的值被複制(或移動)到地圖。

5

make_pair(key, value)返回臨時對象。該對象的生命週期結束於創建它的完整表達式的末尾(基本上以分號表示)。

函數insert從該對創建一個新對象,並將其放入地圖中。地圖存儲該副本,直到地圖被銷燬或元素從地圖中移除。

4

不,你的罰款;包含鍵值和映射值的整個映射項值是複製到地圖數據結構(或有時移動),當您插入它。

在C++ 11,在插入通過m.emplace(key_value, mapped_value);的元件,其不甚至創建臨時pair,或者甚至更好,m.emplace(key_value, arg1, arg2, ...),其插入一個元件與鍵key_value和映射值mapped_type(arg1, arg2, ...)的稍微更直接的方式,甚至沒有爲映射值創建臨時值。