gpt4 book ai didi

c++ - STL::map erase 与 std::vector erase 的行为不同

转载 作者:太空狗 更新时间:2023-10-29 20:06:37 26 4
gpt4 key购买 nike

 class CSensor
{
public:
CSensor(int nVal1,char* pVal2,unsigned int nVal3);
CSensor(const CSensor& refMessage);
const CSensor& operator=(const CSensor& refMessage);
~CSensor(void);
private:
int m_nVal1;
char* m_pVal2;
unsigned int m_nVal3;
};

// vector erase

std::vector<CSensor> SensorList;
CSensor obj1(1,"Test1",10);
SensorList.push_back(obj1);
CSensor obj2(2,"Test2",11);
SensorList.push_back(obj2);
CSensor obj3(3,"Test3",12);
SensorList.push_back(obj3);

SensorList.erase (SensorList.begin()+1);



// map erase
std::map<int ,CSensor> ListSensor;
CSensor obj11(1,"Test1",10);
CSensor obj12(2,"Test2",11);
CSensor obj13(3,"Test3",12);

ListSensor.insert(std::pair<int,CSensor>(1,obj11));
ListSensor.insert(std::pair<int,CSensor>(2,obj12));
ListSensor.insert(std::pair<int,CSensor>(3,obj13));

ListSensor.erase(2);

我调试了这两种情况。 在这两种情况下,我都删除了第二个元素。在 vector 的情况下 它正在将 3 个元素复制到第二个位置,然后删除第三个位置。

所以当你说

   List.erase (List.begin()+1);

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

在 map 的情况下我做

   ListSensor.erase(2);

它只调用析构函数。

我已经经历了STL vector vs map erase . 它使用迭代器,无法解释行为。

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

最佳答案

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

从 vector 中删除

当你从 vector 中删除时 (List 是一个真的不好的 vector 名称,顺便说一句),它的内容必须一起洗牌填补空白,因为 vector 的元素始终连续存储在内存中。

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

  • 内存中的 vector 元素:

    +---+---+---+---+---+---+---+---+---+
    | a | b | c | d | e | f | g | h | i |
    +---+---+---+---+---+---+---+---+---+
  • 删除'e':

    +---+---+---+---+---+---+---+---+---+
    | 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 |
    +---+---+---+---+---+---+---+---+

从 map 中删除

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

关于c++ - STL::map erase 与 std::vector erase 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com