我试图找出如何删除向量中的特定对象。我正在根据名为id的字符串搜索向量。希望有人可以帮助我填补空白!谢谢!我的删除方式是否有效?
我的矢量是这样的:
vector<member*> memb;
这是我到目前为止所做的:
for (int i = 0; i < memb.size(); i++)
{
if( std::find(memb.begin(),memb.end(), id) != memb.end() ) {
myvector.erase (memb.begin(),memb.begin()=id);
}
}
答案 0 :(得分:3)
摆脱你的循环。 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);
}
答案 1 :(得分:0)
vector<member *>::iterator iter;
for (iter=memb.begin(); iter!=memb.end();) {
if ((*iter)->id == id) {
delete (*iter);
iter = memb.erase(iter);
} else {
iter++;
}
}