矢量上的擦除操作不起作用
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) {}
}
请注意,您的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
继承的对象。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 为什么当我对数组使用增量操作时,do for 循环不起作用
- OpenCV像素操作有时不起作用
- 操作溢出不起作用C
- 由于某种原因,使用 OR 运算符执行操作不起作用
- Boost.Spirit解析字符串的语义操作不起作用
- GDB 跟踪点的操作不起作用
- 当 std::fprintf(stderr,..) 失败时,操作是否不起作用,或者可以在失败之前写入一点
- 提升异步操作不起作用(对我来说)
- 矢量上的擦除操作不起作用
- 迭代器操作不起作用
- 带有制表符的strcat操作不起作用
- 标准函数和操作在类构造函数中不起作用