如何从向量<shared_ptr>中删除元素

时间:2015-12-30 19:33:12

标签: c++ vector shared-ptr

我使用以下代码建立了一种注册表类:

class MyClass 
{
    public:
       int a;
       std::string b;
};

class Register
{
    public:
        std::vector<std::shared_ptr<MyClass>> items;

        bool registerItem(std::shared_ptr<MyClass> item)
        {
            /*
             * Check if item exists
             */
            auto position = std::find(items.begin(), items.end(), item);

            if (position != items.end())
                return false;

            items.push_back(item);

            return true;
        }

         bool unregisterItem(std::shared_ptr<MyClass> item)
        {
            auto position = std::find(items.begin(), items.end(), item);

            if (position == items.end())
               return false;

            items.erase(item);

            return true;
        }
};


int main()
{
    std::shared_ptr<MyClass> item1 = new MyClass;

    Register registry;

    if (!registry.registerItem(item1))
        std::cout << "Error registering item1" << std::endl;
    else
        std::cout << "Success registering item1" << std::endl;

    if (!registry.registerItem(item1))
        std::cout << "Error unregistering item1" << std::endl;
    else
        std::cout << "Success unregistering item1" << std::endl;
}

我无法编译此代码,因为items.erase(item)抱怨error: no matching member function for call to 'erase'

为什么我不能删除我添加的对象。从std::shared_ptr中删除std::vector的正确方法是什么?

4 个答案:

答案 0 :(得分:6)

因为你想在items position)中使用迭代器,所以:

items.erase(position);

答案 1 :(得分:2)

有两种声明可用。 From cppreference

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

您尝试std::vector::erase项目本身而不是迭代器。使用

items.erase(position);

代替。

答案 2 :(得分:1)

您必须在erase上致电position,而不是item 因为擦除用在迭代器上

答案 3 :(得分:0)

你应该传递擦除迭代器而不是值,删除std :: shared_ptr没什么特别之处。你在代码中也有错误输入:你注册了两次而不是在第二次调用中注销它。