如果我将其插入到不同范围的地图中,是否需要分配一对?
#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;
}
}
答案 0 :(得分:5)
罚款:
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) );
在这两种情况下,传递给insert()的值都会被复制(或移动)到地图中。
答案 1 :(得分:5)
make_pair(key, value)
返回一个临时对象。该对象的生命周期结束于创建它的完整表达式的末尾(基本上以分号表示)。
函数insert
从该对创建一个新对象,并将其放入地图中。地图存储此副本,直到销毁地图或从地图中删除元素。
答案 2 :(得分:4)
在C ++ 11中,您可以通过m.emplace(key_value, mapped_value);
稍微更直接地插入元素,这甚至不会创建临时pair
,甚至更好,m.emplace(key_value, arg1, arg2, ...)
,插入一个带有键key_value
和映射值mapped_type(arg1, arg2, ...)
的元素,甚至不为映射值创建临时值。