[英]Erase operation on vector not working
我是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
是一个基类,具有两个派生类ChequingAccount
和SavingsAccount
。
我正在使用以下方法将帐户(无论类型如何(可以是Account
, ChequingAccount
, SavingsAccount
))插入此数据库:
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) {}
}
请注意,就std::remove_if
而言,您的remove函数会更好:
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,但从未将其实际放入存储的对象中。
您的del
函数看起来正确,仅建议而不是:
(*it).getId()
您可以/应该使用:
it->getId()
更简单易读。 所以罪魁祸首在别的地方。 至于问题,一切都作为Account
类型拉出,您有切片问题,详细信息在这里阅读什么是对象切片?
您将类Database
作为模板并没有改变任何事实,您可能会误解模板的作用。 您的Database<Account>
无非是您将使用Account
而不是T
并且完全不使用模板,并且您插入了从Value继承自Account
的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.