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);
Run Code Online (Sandbox Code Playgroud)
我调试了这两种情况.在这两种情况下我都删除第二个元素.在向量的情况下,它将3个元素复制到第二个位置,而不是它删除第三个位置.
所以,当你说
List.erase (List.begin()+1);
Run Code Online (Sandbox Code Playgroud)
它调用赋值运算符(CSensor =)然后调用析构函数.
如果是地图我什么时候
ListSensor.erase(2);
Run Code Online (Sandbox Code Playgroud)
它只调用析构函数.
我已经通过STL矢量vs地图擦除.它谈论Iterator,无法解释行为.
我的问题是为什么这两个STL容器的擦除行为不同?
这不是.erase
本身的行为,而是每个相应容器如何工作的结果.
当您从一个载体中删除(List
是一个真正的矢量可怜的名字,顺便说一句),其内容必须沿着改组,以填补了国内空白,因为一个向量的元素总是存储连续在内存中.
这通常通过复制(或移动)元素然后切掉剩余部分来完成:
内存中的向量元素:
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | e | f | g | h | i |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)擦除'e':
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | | f | g | h | i |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)通过复制/移动来填补空白:
<--
+---+---+---+---+---+---+---+---+---+
| 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 |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)调整容器大小:
+---+---+---+---+---+---+---+---+
| a | b | c | d | f | g | h | i |
+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)对于地图而言,情况并非如此,其内容不一定在内存中连续存储(事实上,复杂性要求意味着它几乎总是一个填充了指向不连续数据的指针的树结构).