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

Counter and ID attribute of class stored in vector

关于删除数据库功能代码,我遇到了一个难题。

每当我使用 unique 删除 vector 中的数据库时,我都无法想到编写可以用删除的数字填补空白的代码(就像我删除了数据库 ID3 并且我希望其他数据库的 ID 会递增以具有一个稳定的序列,所以 ID4 的数据库将变成 ID3)。

我也不知道如何减少我的 static 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;
}

头文件:


"




你在这里做的事情叫做设计 anti-pattern: 在很多情况下你很容易想到的一些结构性想法,但那是会有很多麻烦(即不好)。它称为 单例 :您假设永远只有一个 DbMain,因此您将其长度存储在“global-alike”静态成员中。没有意义!只需使用 DbMain 的长度即可。无论如何,您永远不需要全局或静态成员来计算您集中存储的对象。

您实际上 不需要 ID 成为您存储的对象的一部分 – 它的全部目的是作为 dBMain 存储中的索引。已经订购了矢量!因此,不是在遍历向量时打印 .ID,而是简单地打印向量中的位置。您可以“擦除 (DbMain.begin() + N) 元素”并完成它,而不是“找到 ID == N 的基数并擦除”。

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

  • 您需要在每次删除时重新编号很多 ID,这会使维护变得非常困难 cross-references。
  • 您可以拥有多个数据库,每个数据库都有自己的一组 ID。
  • 如果您在不读取碱基的情况下添加碱基,则可能无法获得正确的计数器值。

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

您唯一关心的就是确保 ID 的唯一性。当然,如果您确保在创建新基地时更新它,并且状态与数据库一起保存在您将保存所有这些的文本文件中,那么您的反击方法可能会奏效。您只需要明确指出不保证 ID 是连续的。确保有助于这种理解的实用方法是在尝试删除未找到的记录时发出错误消息。