我有以下地图结构:map < pair < int,int >, object* >
我希望插入其中。
我是怎么做的,因为我试图插入一对和一个对象而我必须一对?
我应该使用make_pair()
中的{{1}}创建一对新对吗?如果是的话,请你告诉我怎么做?
答案 0 :(得分:20)
object * myObject = // get an object somehow
myMap.insert(std::make_pair(std::make_pair(1,2), myObject));
或
typedef map<pair<int, int>, object *> MapType;
object * myObject = // get an object somehow
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject));
答案 1 :(得分:11)
假设您使用的是C ++ 11或更高版本,最佳方法可能是:
object * myObject = // get an object somehow
myMap.emplace({1,2}, myObject);
对于地图,emplace
可以被认为是insert
的一个版本,它将键和值作为单独的参数(它实际上可以采用相应pair
的任何参数组合类型的构造函数可以采取)。除了在语法上更清晰之外,它还可能比make_pair
更有效,因为make_pair
通常会产生一个输出,其类型与容器的value_type
不完全匹配,所以它导致不必要的类型转换。
我曾经推荐过这个,它也只适用于C ++ 11或更高版本:
object * myObject = // get an object somehow
myMap.insert({{1,2}, myObject});
这避免了emplace
稍微令人惊讶的使用,但如果键或值类型是仅移动的(例如unique_ptr
),它以前不起作用。这已在标准中得到修复,但您的标准库实现可能尚未获得修复。从理论上讲,这也可能稍微低一些,但是在某种程度上,任何中途正常的编译器都可以轻松地优化掉。
答案 2 :(得分:1)
有两种方法:
typedef std::map<int,Object> map_t;
map_t map;
Object obj;
std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1
map[1] = obj; // 2
仅当密钥不存在时才有效,迭代器指向具有键值的对,bool表示是否已插入密钥。
更容易,但如果它尚不存在,则首先默认构造对象,然后分配该对象而不是复制构造
如果您不必担心性能,只需选择是否要删除之前的条目。
答案 3 :(得分:-1)
int a = 10,b = 20;
map <对
pair
int sum = a + b;
m [numbers] = sum;
我们的地图将其键作为数字对。我们可以使用dot(。)运算符访问对变量的整数值。