擺脫你的循環。 std::find()
(和std::find_if()
)爲您做了必要的循環。
std::find()
(和std::find_if()
)如果找到則返回元素的迭代器,如果未找到則返回指定的last
迭代器。如果找到元素,則將返回的迭代器傳遞給矢量的erase()
方法以刪除元素。
由於您在向量中存儲指針,因此無法使用std::find()
通過std::string
值進行搜索。您需要改用std::find_if()
。
嘗試這種情況:
struct isID
{
const std::string &m_id;
isID(const std::string &id) : m_id(id) {}
bool operator()(const member *m) const
{
return (m->id == m_id);
}
};
std::string id = ...;
std::vector<member*>::iterator iter = std::find_if(memb.begin(), memb.end(), isID(id));
if (iter != memb.end())
{
// since you are storing pointers in the vector, you
// need to free the object being pointed at, if noone
// else owns it...
//delete *iter;
memb.erase(iter);
}
或者,如果使用的是C++ 11或更高:
std::string id = ...;
auto iter = std::find_if(memb.begin(), memb.end(),
[id](const member* m) { return (m->id == id); });
if (iter != memb.end())
{
// since you are storing pointers in the vector, you
// need to free the object being pointed at, if noone
// else owns it...
//delete *iter;
memb.erase(iter);
}
在後一種情況下,如果載體是旨在自己的對象,您可以存儲std::unique_ptr
對象的向量來自動釋放member
個對象爲您提供:
std::vector<std::unique_ptr<member>> memb;
...
std::unique_ptr<member> m(new member);
// or: std::unique_ptr<member> m = std::make_unique_ptr<member>();
memb.push_back(std::move(m));
// or: memb.push_back(std::unique_ptr<member>(new member));
// or: memb.push_back(std::make_unique<member>());
// or: memb.emplace_back(new member);
...
if (iter != memb.end())
{
// std::unique_ptr will free the object automatically
// when the std::unique_ptr itself is destroyed...
memb.erase(iter);
}
歡迎堆棧溢出!雖然這段代碼可能會回答這個問題,但提供關於* why和/或* how *這個代碼如何回答這個問題的附加上下文會提高它的長期價值。 –