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);
我已经调试了这两种情况。在两种情况下,我都在删除第二个元素。对于向量,它会将第3个元素复制到第2个位置,然后再删除第3个位置。
所以当您说...
List.erase (List.begin()+1);
它正在调用赋值运算符(CSensor =),然后调用析构函数。
在使用map时,当我执行
ListSensor.erase(2);
它只调用析构函数。
我阅读了关于STL vector vs map erase的文章(英文),其中涉及到迭代器,但无法解释其行为。
我的问题是:为什么这两个STL容器的erase行为不同?