我有std::map
。我找到了键的下限,并确保键未在地图中使用。我可以将一个元素插入给定的地图迭代器吗?如果是这样的话?
map<int, double> m;
int key = 1;
auto itr = m.lower_bound(key);
if (itr == m.end() || itr->first != key)
m.insert(itr, make_pair(key, 3.14)); // how is the performance? Any better way?
答案 0 :(得分:3)
关联容器要求说明emplace_hint
和相关操作,复杂性一般是对数,但如果在p
&#34;之前插入元素,则摊销常数。 (其中p
是提示迭代器)。
因此,如果您只使用正确的提示,那么复杂性是摊销 - 常数,与地图的大小无关。 (当然,您仍需要执行初始查找的成本。)
答案 1 :(得分:1)
&#34;暗示&#34;的想法版本insert()
是地图可以传递的迭代器作为对象可能去向的指示。如果在p之前插入t,则可以保证性能是平均值。&#34; (其中p
是提示迭代器)。
如果值构造起来相当便宜,建议直接使用m.insert(std::make_pair(key, 3.14))
:如果insert()
失败,则元素保持不变。该函数返回std::pair<iterator, bool>
,其中first
元素指向新插入的元素,second
元素指示节点是否已插入。