如何从STL向量中删除一个特定值的项目?

162

我正在查看STL vector的API文档,注意到vector类中没有允许移除某个特定值元素的方法。这似乎是一种常见操作,也很奇怪为什么没有内置方法可以实现这个功能。


2
我知道我以前已经提到过这个问题,但是Scott Meyer的书 Effective STL 以清晰明了的方式涵盖了这些陷阱。 - Rob Wells
1
相关链接:https://dev59.com/wHA75IYBdhLWcg3wRWyc - bobobobo
这可能是对您有趣的阅读内容:http://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom - sergiol
12个回答

0

类似于erase remove idiom,对于vector,可以使用resizeremove,并使用迭代器距离计算:

std::vector<int> vec;
// .. put in some values ..
int int_to_remove = n;
vec.resize(std::remove(vec.begin(), vec.end(), int_to_remove) - vec.begin());

已测试此处


-1

如果您想在不添加任何额外文件的情况下完成这个任务:

vector<IComponent*> myComponents; //assume it has items in it already.
void RemoveComponent(IComponent* componentToRemove)
{
    IComponent* juggler;

    if (componentToRemove != NULL)
    {
        for (int currComponentIndex = 0; currComponentIndex < myComponents.size(); currComponentIndex++)
        {
            if (componentToRemove == myComponents[currComponentIndex])
            {
                //Since we don't care about order, swap with the last element, then delete it.
                juggler = myComponents[currComponentIndex];
                myComponents[currComponentIndex] = myComponents[myComponents.size() - 1];
                myComponents[myComponents.size() - 1] = juggler;

                //Remove it from memory and let the vector know too.
                myComponents.pop_back();
                delete juggler;
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接