gpt4 book ai didi

c++ - 类型的空 vector

转载 作者:行者123 更新时间:2023-11-28 01:08:44 26 4
gpt4 key购买 nike

我有一个填充了对象的 vector :

std::vector<Stuff*> stuffVector;

并且正在尝试使用清理函数删除它的所有元素

void CleanUp()
{
for (std::vector<Stuff*>::size_type i = 0 ; i < stuffVector.size() ; i++)
{
stuffVector.erase(stuffVector.begin()+i);
}
cout << stuffVector.size() << endl;
if (stuffVector.size() == 0) cout << "Vector Emptied" << endl;
}

无论 vector 中有多少对象,这总是会返回一个大小的报告,实际上似乎根本没有删除任何东西。这很奇怪,因为类似的函数在其他地方可以从 vector 中删除特定对象:

void DestroyStuff()
{
if (stuffVector.size() > 1)
{
for (std::vector<Stuff*>::size_type i = 0 ; i < stuffVector.size() ; i++ )
{
if(stuffVector[i]->CanDestroy())
{
stuffVector.erase (stuffVector.begin()+i);
}
}
}
}

上面的工作正常,但 CleanUp() 没有。为什么会发生这种情况?

最佳答案

当您删除一个元素时, vector 的大小会发生变化。所以你的循环会跳过元素,因为在一些迭代中你 erase()i++

此外,要删除 vector 的每个元素,clear() 函数很有用。此外,循环遍历 vector 中所有元素的标准方法是使用迭代器。您的代码应如下所示:

void CleanUp()
{
for (std::vector<Stuff*>::iterator it = stuffVector.begin() ; it != stuffVector.end() ; it++)
{
/* .. do something to each element to prepare it for removal */
delete *it; // clean up resources?
}
stuffVector.clear();
cout << stuffVector.size() << endl;
if (stuffVector.size() == 0) cout << "Vector Emptied" << endl;
}

void DestroyStuff()
{

for (std::vector<Stuff*>::iterator it = stuffVector.begin() ; it != stuffVector.end() ; /*done inline*/)
{
if((*it)->CanDestroy())
{
it = stuffVector.erase(it);
}
else
++it;
}
}

此循环有效是因为 erase() 返回指向列表中下一个元素的迭代器。

关于c++ - <stuff*> 类型的空 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4719484/

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