是堆栈还是堆上的make_pair?

joe*_*els 4 c++ memory map

如果我将其插入到不同范围的地图中,是否需要分配一对?

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ork 5

没关系:

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

std :: make_pair按值返回结果。

上面的效果与:

inputs->insert( std::pair<std::string, std::string>(key, value) );
Run Code Online (Sandbox Code Playgroud)

在两种情况下,传递给insert()的值都将被复制(或移动到)映射中。


Man*_*rse 5

make_pair(key, value)返回一个临时对象.该对象的生命周期在创建它的完整表达式的末尾结束(基本上以分号表示).

该函数insert从该对创建一个新对象,并将其放入地图中.地图存储此副本,直到地图被销毁或从地图中删除元素.


Ker*_* SB 5

不,你很好;插入时,整个映射条目值(由键值和映射值组成)将复制到映射数据结构中(或有时会移动)。

在 C++11 中,您有一种稍微更直接的方法来插入元素 via m.emplace(key_value, mapped_value);,它甚至不创建临时的pair,或者更好的是,它插入带有 key和映射 value 的m.emplace(key_value, arg1, arg2, ...)元素,甚至不需要为映射值创建临时的。key_valuemapped_type(arg1, arg2, ...)