矢量上的擦除操作不起作用

Erase operation on vector not working

本文关键字:操作 不起作用 擦除      更新时间:2023-10-16

我是C++的新手,很难让vector.erase操作正常工作。

我有一个这样的数据库类:

template <class T> class Database
{
    protected:
        std::vector<T> m_database;
        int m_counter;
    public:
        Database();
        virtual ~Database();
        // Accessor Methods.
        T& getObject(int objectId);
        bool exists(int objectId);
        // Mutator Methods.
        void add(T Object);
        void del(int objectId);
};

在实践中,我使用这样的代码:

Database<Account> accountDatabase;

Account是一个基类,有两个派生类ChequingAccountSavingsAccount

我正在使用将帐户插入此数据库,而不考虑类型(可以是AccountChequingAccountSavingsAccount

template <class T> void Database<T>::add(T object)
{
    m_database.push_back(object);
    ++m_counter;
}

但是,我的删除操作出现问题。我正在搜索相应的objectId,然后将其从向量中删除。

// Deletes the specified object from the database.
template <class T> void Database<T>::del(int objectId)
{
    std::vector<T>& database             = m_database;
    typename std::vector<T>::iterator it = database.begin();
    while (it != database.end()) {
        if ((*it).getId() == objectId) {
            it = database.erase(it);
        } else {
            ++it;
        }
    }
}

很遗憾,删除操作根本不起作用。我还遇到了从数据库中提取派生类的问题,因为所有内容都是作为Account类型提取的。我相信这两个问题与我的noob C++技能和糟糕的设计有关。

如有任何帮助,我们将不胜感激!谢谢

编辑

不工作,我的意思是对象不会从数据库中删除。如有任何混淆,我深表歉意。

账户类别:

class Account
{
    protected:
        int m_id;
        double m_balance;
        std::string m_name, m_type;
    public:
        Account(int id, int userId, double balance = 0, std::string name = ""); // Constructor.
        ~Account(); // Destructor.
        // Accessor Methods.
        // This returns m_id AKA objectId
        int getId() const;
}
class ChequingAccount: public Account
{
    public:
        ChequingAccount(int id, int userId, double balance, std::string name) : Account(id, userId, balance, name) {}
}
class SavingsAccount: public Account
{
    public:
        SavingsAccount(int id, int userId, double balance, std::string name) : Account(id, userId, balance, name) {}
}

请注意,您的remove函数在std::remove_if:方面会更好

auto endIterator = std::remove_if(m_database.begin(), m_database.end(),
    [=](T const& entry) { return entry.getId() == objectId; }
    );
m_database.erase(endIterator, m_database.end());

也就是说,你的版本看起来并没有错,只是效率低下。那它"不起作用"呢?我确实注意到,您在数据库中维护了一个单独的对象ID,但从未将该ID实际放入存储的对象中。

您的del函数看起来是正确的,唯一的建议是:

(*it).getId()

您可以/应该使用:

it->getId()

其更简单且更可读。所以罪魁祸首在别的地方。至于问题,所有东西都被拉为Account类型,您有切片问题,详细信息请阅读此处什么是对象切片?

事实上,您使类Database成为模板并没有改变任何内容,您可能误解了模板的作用。您的Database<Account>只不过是使用Account而不是T,并且根本不使用模板,然后插入按值从Account继承的对象。