gpt4 book ai didi

c++ - 这是在 std::vector 中存储、迭代和删除指针的好方法吗?

转载 作者:行者123 更新时间:2023-11-28 07:57:35 25 4
gpt4 key购买 nike

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;

struct delete_ptr
{
template<typename T>
void operator()(T*& t)
{
delete t;
t = 0;
}
};

struct is_null_ptr
{
template<typename T>
bool operator()(T*& t)
{
return t == 0;
}
};

struct A
{
static void removeDead(A*& a)
{
if(a and a->dead)
delete_ptr()(a);
}

static void killSome(A* a)
{
if(a and a->isDead() == false and rand()%100 == 0)
{
static int counter = 0;
cout << "Kill___" << ++counter << endl;
a->kill();
}
}

static void reviveSome(A* a)
{

if(a and a->isDead() and rand()%3 == 0)
{
static int counter = 0;
cout << "Revive___" << ++counter << endl;
a->revive();
}
}

A():dead(false)
{

}

virtual ~A()
{
static int counter = 0;
cout << "Dtor___" << ++counter << endl;
}

bool isDead(){return dead;}
void kill(){dead = true;}
void revive(){dead = false;}

bool dead;
};

int main()
{
srand(time(0));
vector<A*> as;
for(int i = 0; i < 200; ++i)
{
A* a = new A;
as.push_back(a);
}


for_each(as.begin(),as.end(),A::killSome);
for_each(as.begin(),as.end(),A::reviveSome);

for_each(as.begin(),as.end(),A::removeDead);
as.erase( std::remove_if(as.begin(),as.end(),is_null_ptr()),as.end());
cout << as.size() << endl;

for_each(as.begin(),as.end(),delete_ptr());
as.clear();

return 0;
}

它分配它们,并打印正确的输出,但我不确定我正在做的事情是否正确。我只是想在 vector 中使用指针并在特定情况发生时删除它们,而不使用 boost 或 c++11。那你怎么看呢?

最佳答案

由于当前 STL 中唯一的智能指针 (auto_ptr) 无法在容器中使用,我认为在给定条件下您的方法是一个很好的方法。

不过,您可以考虑实现自己的 unique_ptr 或 shared_ptr。

PS:使用指针而不是容器中的实际对象有很多原因,一个是多态性。另一个是实际对象已经存储在其他地方(想想已经存储的对象的索引结构)。

关于c++ - 这是在 std::vector 中存储、迭代和删除指针的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350301/

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