C++ 在STL映射中的所需位置插入元素

C++ 在STL映射中的所需位置插入元素,c++,stl,map,iterator,C++,Stl,Map,Iterator,我已经增加了迭代器。为什么它还在被分类?如果位置应该由映射自己改变,那么提供迭代器的目的是什么?因为它是一个排序关联容器 在映射中,键值通常用于唯一标识元素,而映射值是与该键关联的某种值 根据位置参数为 要为插入进行比较的第一个元素的位置 活动请注意,这并不强制新元素处于 集合中地图容器元素内的位置始终为 遵循特定的顺序,但这实际上表明 容器中可能的插入位置,如果设置为 位于元素所在的实际位置之前的元素 插入,使插入操作非常有效。迭代器是 成员类型,定义为双向迭代器类型 因此,该参数的目的主要是

我已经增加了迭代器。为什么它还在被分类?如果位置应该由映射自己改变,那么提供迭代器的目的是什么?

因为它是一个排序关联容器

在映射中,键值通常用于唯一标识元素,而映射值是与该键关联的某种值

根据位置参数为

要为插入进行比较的第一个元素的位置 活动请注意,这并不强制新元素处于 集合中地图容器元素内的位置始终为 遵循特定的顺序,但这实际上表明 容器中可能的插入位置,如果设置为 位于元素所在的实际位置之前的元素 插入,使插入操作非常有效。迭代器是 成员类型,定义为双向迭代器类型

因此,该参数的目的主要是通过缩小元素范围来略微提高插入速度


如果插入顺序很重要,可以使用std::vector。

正如sad_man所说,它是关联的。如果使用现有键设置值,则覆盖上一个值


现在,迭代器是必要的,因为您通常不知道键是什么。

映射始终是排序的,但作为优化,您给出了元素可能走向的提示

插入是Olog N,但是如果您能够成功地告诉容器它要去哪里,那么它是恒定时间


因此,如果您正在创建一个包含已排序值的大型容器,那么每个值都将在末尾插入,尽管树需要多次重新平衡。

该接口确实有点令人困惑,因为它看起来非常像std::vector::insert,但并没有产生相同的效果

对于关联容器,如set、map和新的无序_set和co,您完全放弃了对元素顺序的控制,如在容器上迭代所示。作为失去控制的交换,您可以获得高效的查找

突然让您控制插入是没有意义的,因为这会让您破坏容器的不变量,并且您将失去高效的查找功能,而这正是首先使用此类容器的原因

因此,插入位置、值类型和值不会在所述位置插入

然而,这为我们提供了一些优化空间:当在关联容器中插入元素时,需要执行查找以确定插入该元素的位置。通过让您指定一个提示,您将有机会帮助容器加快流程

可以用一个简单的例子来说明这一点:假设您收到的元素已经通过某个接口进行了排序,不使用这些信息将是浪费

rollCallRegister contains:
33 => sindhu
44 => shweta
55 => swati

有些项目可能没有很好地排序,但这并不重要,如果两个连续的项目顺序正确,那么我们将获得,否则。。。我们将照常执行。

但是,使用迭代器指定位置的目的是什么?@AnishaKaul:position是指插入操作要比较的第一个元素。请注意,这不会强制新元素位于贴图容器中的该位置。这里是一个位置,指插入操作中要比较的第一个元素,需要比较什么?我只关注这个链接,是不是有什么地方提到了原因?我看不到。需要进行比较,以便按照使用比较类指定的顺序对键进行排序。请转到答案中的链接,阅读关于std::map的内容。@Anisha-是的,这是一个可能的优化。如果您告诉映射插入的正确位置,操作可能会稍微快一点。使用迭代器编写操作的另一种方法是什么,而不指定键?啊!我现在明白你的意思了。您指的是插入调用中使用的迭代器。我将使用[]操作符。rollCallRegister[33]=sindhu;你可能想看看这些页面:亚历克西斯看到我对另一个答案的评论。我有一个误解。而且,在'rollCallRegister[33]=sindhu;'密钥已经知道。\n您的意思是,我们需要告诉编译器如何排序吗?如果列表很大,这是不切实际的,不是吗?@AnishaKaul我们什么都不告诉编译器,只告诉容器;map允许您在地图中指定正确的位置,因此它不必去寻找它。如果指定的位置不正确,它仍将搜索正确的位置。当您希望内容大致排序时,您可以这样做,这可能对大型收藏产生重要影响。谢谢Matthieu,您的回答确实很有帮助,但为时已晚+1.
rollCallRegister contains:
33 => sindhu
44 => shweta
55 => swati
template <typename Key, typename Value, typename InputStream>
void insert(std::map<Key, Value>& m, InputStream& s) {
  typename std::map<Key, Value>::iterator it = m.begin();

  for (; s; ++s) {
    it = m.insert(it, *s).first;
  }
}