STD :: MAP-使用下标操作员与插入方法添加元素



我正在尝试理解并确保将元素插入std::map是否有效地相同。

std::map<int, char> mymap;

在声明mymap-将通过这三种方法插入具有值 a的元素CC_3?

是相同的?
  1. mymap[10]='a';

  2. mymap.insert(mymap.end(), std::make_pair(10, 'a'));

  3. mymap.insert(std::make_pair(10, 'a'));

尤其是,当std::map中没有现有元素?

时,使用mymap.end()是否有意义

主要区别是(1(首先默认键入地图中的key对象,以便能够返回对该对象的引用。这使您可以为其分配一些东西。

如果您正在使用存储在地图中但没有默认构造函数的类型,请记住这一点。示例:

struct A {
   explicit A(int) {};
};
std::map<int, A> m;
m[10] = A(42); // Error! A has no default ctor
m.insert(std::make_pair(10, A(42))); // Ok
m.insert(m.end(), std::make_pair(10, A(42))); // Ok

另一个值得注意的区别是(如@petebecker在评论中指出的那样((1(覆盖地图中的现有条目,而(2((3(不要。

是的,它们实际上是相同的。在声明mymap之后,这三种方法将mymap变成{10, 'a'}

std::map中没有现有元素时,可以使用mymap.end()。在这种情况下,begin() == end()是表示空容器的通用方式。

(1(与(2(和(3(不同,如果存在具有相同键的元素。(1(将替换元素,其中(2(和(3(将失败并返回值表示插入。

(1(还要求映射类型默认可构造。实际上(1(首先默认构造对象(如果不存在(,并将其替换为指定的值。

(2(和(3(也不同。要了解差异,我们需要了解(2(中的迭代器。从cppReference中,迭代器是指插入尽可能接近该提示的提示。性能差异取决于提示的有效性。从同一页面引用:

摊销常数如果插入发生在提示之后的位置中,则否则在容器的大小上进行对数。(直到C 11(

>

摊销常数如果插入发生在提示之前的位置中,则在容器大小的情况下进行对数。(由于C 11(

因此,对于大型地图,如果我们已经以某种方式知道该位置,我们可以得到性能提升。

说了所有这些,如果刚创建了地图,并且您正在进行操作,如您在问题中所说的那样,地图中没有任何元素如上所述将不同(。

最新更新