C ++如何删除向量中的特定对象?

时间:2016-04-06 02:19:38

标签: c++ loops vector

我试图找出如何删除向量中的特定对象。我正在根据名为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);
    }
} 

2 个答案:

答案 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++;
       }
    }