类的计数器和ID属性存储在vector中



关于删除数据库函数代码,我有一个两难的选择。

每当我用唯一的向量删除数据库时,我无法想到编写可以用删除的数字填补空白的代码(就像我删除了数据库ID3,我希望进一步数据库的id会增加以具有稳定的序列,因此具有ID4的数据库将成为ID3)。

我也不知道如何减少静态int计数器

文件:

**void Database::Rem()
{
int dddddet;

cin >> dddddet;

if (iter !=  DbMain.end())
{
DbMain.erase(iter);
}
}**
std::istream &operator>>(std::istream &re, Base &product)
{

}
}
std::ostream &printnames(std::ostream &pr, Base &pro)
{
pr << "nID:" << pro.ID << "nName:" << pro.name;
return pr;
}

头文件:


"


您在这里做的事情被称为设计反模式:在很多情况下您可以很容易地提出一些结构上的想法,但这会带来很多麻烦(也就是说,不好)。它被称为单例你假设只有一个DbMain,所以你把它的长度存储在一个"全局相似的"静态成员。没道理!只需使用DbMain的长度。无论如何,你不应该需要一个全局或静态成员来计算你集中存储的对象。

您实际上从来没有需要ID作为您存储的对象的一部分-它的全部目的是作为dBMain存储中的索引。一个向量已经是有序的!因此,在迭代vector时,不需要打印. id,而只需打印vector中的位置。而不是"找到ID == N的基并擦除";您可以执行"擦除(DbMain.begin() + N)元素";然后完成它。

设计中的问题是,当您使用静态计数器初始化ID时,您似乎以某种方式将唯一ID与向量中的索引关联起来。这不是一个好主意,因为:

  • 你需要在每次删除时重新编号很多id,这将使维护交叉引用变得非常困难。
  • 你可以有几个数据库,每个数据库都有自己的一组id。
  • 有一个风险,你不会得到计数器正确的值,如果你添加碱基没有读取它们。

此外,顺序迭代查找ID的效率不高。更有效的方法是将基数存储在std::map中:这允许非常有效地查找ID,通过ID而不是序列号进行索引。

你唯一关心的就是确保id的唯一性。当然,如果您确保在创建新基时更新计数器,并且将状态与保存所有这些内容的文本文件中的数据库持久化,那么您的计数器方法也可以工作。您只需要弄清楚,这些id不能保证是连续的。一种确保有助于理解这一点的实用方法是,如果试图删除未找到的记录,则发出错误消息。

相关内容

  • 没有找到相关文章

最新更新