摆脱你的循环。 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 *这个代码如何回答这个问题的附加上下文会提高它的长期价值。 –