2012-01-24 148 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, ...)的稍微更直接的方式,甚至没有为映射值创建临时值。