我写了一个简单的程序来测试“vector.erase”特性。有一个简单的类(MyClass0),它在构造函数中写入一些相关的消息,在析构函数中写入另一个消息。然后有一个包含4个MyClass0类型对象的向量。当我擦除向量的第二个元素时:
vec0.erase(vec0.begin() + 1);
我假设消息“Goodbye From 2”应该在屏幕上输出。但是消息“Goodbye From 4”显示出来了。看起来是向量的第4个元素的析构函数被调用了。(虽然事实并非如此,因为第4个元素将在最后被销毁,当“main”完成时)。有人能帮助我吗,这样我就可以找到原因。代码和屏幕上显示的输出是:
编码:
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
class MyClass0
{
public:
MyClass0(int i_i_) : i_(i_i_)
{
cout << "Hello From " << this->i_ << endl;
}
~MyClass0()
{
cout << "GoodBye From " << this->i_ << endl;
}
std::string MyToString()
{
return std::string("This is ") + std::to_string(this->i_);
}
private:
int i_;
};
int main()
{
std::vector<MyClass0> vec0 = { MyClass0(1), MyClass0(2), MyClass0(3), MyClass0(4) };
cout << endl << "Before erasing..." << endl;
vec0.erase(vec0.begin() + 1);
cout << "After erase" << endl << endl;
return 0;
}
屏幕上的输出:
Hello From 1
Hello From 2
Hello From 3
Hello From 4
GoodBye From 4
GoodBye From 3
GoodBye From 2
GoodBye From 1
Before erasing...
GoodBye From 4
After erase
GoodBye From 1
GoodBye From 3
GoodBye From 4
2条答案
按热度按时间omhiaaxx1#
她是你的代码修改了一点
暴露实际发生的事情:https://godbolt.org/z/hW177M7o6
当vector从中间移除项目时,它使用
operator=
将项目向左移动,然后删除最后一个项目。c90pui9n2#
矢量中间不允许有任何空洞。这意味着当你擦除第二个元素时,你实际上并没有删除它。所发生的是所有元素向前移动以填充空洞,然后矢量中的最后一个元素可以被删除,因为它已经向前移动了一次