2015-12-03 16 views
1

我有一个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? 
+2

它工作吗?如果是这样,很好。如果没有,告诉我们它不工作的方式。至于“表现如何?”,请根据您的选择进行测量。我们无法预测您的代码,构建配置,编译器,操作系统,平台,体系结构和计算机的行为。 –

+2

只使用插入有什么问题?它已经检查密钥是否存在。 – Kevin

回答

3

关联容器的要求说一下emplace_hint及相关业务的复杂性“在一般的对数,但如果该元素p前右插分期常量”(其中p是暗示迭代器)。

所以,如果你只使用正确的提示,那么复杂度是摊销常量,独立于地图的大小。 (当然,你仍然需要执行初始查找的代价。)

1

insert()的“提示”版本的思想是映射可以传递迭代器作为对象可以到达的指示。有保证,如果在p之前插入t,则表现为“摊销不变。” (其中p是提示迭代器)。

如果构建的价格合理便宜,建议直接使用m.insert(std::make_pair(key, 3.14)):如果insert()失败,则元素保持不变。该函数返回std::pair<iterator, bool>,其中first元素指向新插入的元素,second元素指示节点是否已插入。

+2

如果密钥不存在于地图中,则“lower_bound”和“upper_bound”是等价的。 –

+0

@ T.C .:真的 - 我没有想到通过正确的。我将删除答案的相应部分...谢谢。 –

相关问题