从C++容器中删除对象而不删除它们

Mic*_* IV 5 c++ 3d-engine stdvector

我正在使用C++ std向量存储渲染对象以进行简单的场景图实现.我需要能够在场景图中添加和删除运行时渲染对象.添加不是问题,用于删除:读取矢量和其他的文档C++容器看起来当弹出对象时会调用它们的析构函数.这不是我需要的,因为我希望以后能够将这些对象重新添加到渲染循环中.这个问题的可能解决方案是什么?我忘了提到的重要细节 - 我正在使用指向渲染对象的指针向量.

Nik*_* C. 10

您似乎对对象实例的基本概念感到困惑.向向量添加内容时,不要将其移入到向量中,复制它:

vector<string> vec;
string s;
vec.push_back(s);
Run Code Online (Sandbox Code Playgroud)

vec[0]是不是 s,它的一个副本s.所以,当你从载体中删除,s是不会受到影响.

如果您不想要副本,则应切换到指针.你可以从向量中删除指针,并且不会调用它们指向的对象的析构函数.

编辑:好的,似乎你已经在使用指针了.你说:

读取向量和其他C++容器的文档时,看起来当弹出对象时,会调用它们的析构函数

那是真实的.从向量中删除指针时,指针将被销毁.这就是文档的意思.它并不意味着指针指向的对象被破坏:

vector<string*> vec;
string s;
vec.push_back(&s);
vec.pop_back();
Run Code Online (Sandbox Code Playgroud)

s根本不受影响.弹出操作被破坏的是指针,它s不包含s自身的地址.

所以你没事.

  • @MichaelIV然后你没有问题; 从向量中删除指针时,只会破坏指针,而不是指针指向的对象. (2认同)