Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ stl::映射擦除与std::向量擦除的行为不同_C++_Stl - Fatal编程技术网

C++ stl::映射擦除与std::向量擦除的行为不同

C++ stl::映射擦除与std::向量擦除的行为不同,c++,stl,C++,Stl,它调用赋值运算符(CSensor=),然后调用析构函数 如果是地图,当我做的时候 List.erase (List.begin()+1); 它只调用析构函数 我经历过。 它使用迭代器,无法解释其行为 我的问题是为什么这两个STL容器的擦除行为不同???这是使用不同容器的原因之一 向量必须复制元素之后的元素,以覆盖它留下的“孔”。否则元素将不再是连续的 映射将其元素保存在树结构中,只需调整一些指针即可重新平衡树 为向量辩护:复制两个元素可能比单独分配树节点并保持树平衡更便宜。总是有权衡 这

它调用赋值运算符(CSensor=),然后调用析构函数

如果是地图,当我做的时候

   List.erase (List.begin()+1);
它只调用析构函数

我经历过。 它使用迭代器,无法解释其行为


我的问题是为什么这两个STL容器的擦除行为不同???

这是使用不同容器的原因之一

向量必须复制元素之后的元素,以覆盖它留下的“孔”。否则元素将不再是连续的

映射将其元素保存在树结构中,只需调整一些指针即可重新平衡树


为向量辩护:复制两个元素可能比单独分配树节点并保持树平衡更便宜。总是有权衡

这不是
.erase
本身的行为,而是每个容器工作方式的结果

从向量中删除 当你从一个向量中删除时(
List
对于一个向量来说是一个非常糟糕的名字,顺便说一句),它的内容必须被洗牌以填补空白,因为向量的元素总是连续地存储在内存中

这通常是通过复制(或移动)元素然后切掉剩余部分来完成的:

  • 内存中的矢量元素:

       ListSensor.erase(2);
    
  • 删除“e”:

    +---+---+---+---+---+---+---+---+---+
    | a | b | c | d | e | f | g | h | i |
    +---+---+---+---+---+---+---+---+---+
    
  • 通过复制/移动来填补空白:

    +---+---+---+---+---+---+---+---+---+
    | a | b | c | d |   | f | g | h | i |
    +---+---+---+---+---+---+---+---+---+
    

从地图上删除
地图的情况并非如此,它的内容不一定连续地存储在内存中(事实上,复杂性要求意味着它几乎总是一个树结构,充满指向不连续数据的指针)。

我同意@Tomalak Geret'kal。我只想扩大讨论范围。数据结构是否是向量迭代器无效的原因,而映射中的迭代器不会使迭代器无效。@Chris_vr:这个问题没有真正意义。vector和map都是容器的类型,所以“数据结构”(正如您所说)与我们正在讨论的所有内容都相关。非常好地说明了答案:)@Chris_vr:(但是,是的,元素在各自容器中存储方式的差异导致了每个容器的不同。)这是关于内存内部的一个很好的解释,但是它没有回答关于调用操作符=…的问题,因为它们是不同的容器?你为什么期望他们以完全相同的方式工作?为什么他们都会存在?!C++是一种区分大小写的语言,如果我们在交流时,我们可以精确地理解这一点。该标准没有要求为
std::map
创建树。它只是设置了一些需求,引导您在一个合理的实现中实现这些需求。
+---+---+---+---+---+---+---+---+---+
| a | b | c | d |   | f | g | h | i |
+---+---+---+---+---+---+---+---+---+
                   <--
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | f | f | g | h | i |
+---+---+---+---+---+---+---+---+---+

                       <--
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | f | g | g | h | i |
+---+---+---+---+---+---+---+---+---+

                           <--
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | f | g | h | h | i |
+---+---+---+---+---+---+---+---+---+

                               <--
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | f | g | h | i | i |
+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| a | b | c | d | f | g | h | i |
+---+---+---+---+---+---+---+---+