从向量中按内存地址删除共享指针

问题描述

我有一个包含共享指针的向量。我想通过使用其内存地址从列表中删除一个指针,这可能吗?还是有更好的方法来存储共享指针的集合?


std::vector<std::shared_ptr<Person>> list;

void removePerson(const std::shared_ptr<Person>& person) {
                auto remove = std::remove(list.begin(),list.end(),person);
                list.erase(remove,list.end());
    }

解决方法

是的,可以通过地址从指针容器中删除指针。

尽管 p = [] for p1,p2,p3,p4 in zip(x,y,z,w): p.extend([int(p1),int(p2),int(p3),int(p4)]) 是存储共享指针的一种普通方法,但是如果不了解您的要求,就无法回答哪种方法更好的问题。

这里是模板的扩展,以演示使用自己的std::vector<std::shared_ptr<T>>函数按地址删除指针的方法:

removePerson()

这将产生以下输出:

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <vector>

// A minimal Person type for demonstration purposes
struct Person {
    Person(const std::string& n): name(n) {}
    std::string name;
};

// Original template
std::vector<std::shared_ptr<Person>> persons;

void removePerson(const std::shared_ptr<Person>& person) {
    auto remove = std::remove(persons.begin(),persons.end(),person);
    persons.erase(remove,persons.end());
}

int main()
{
    auto bob = std::make_shared<Person>("bob");

    // Include bob multiple times to demonstrate multiple removal
    persons.emplace_back(bob);
    persons.emplace_back(std::make_shared<Person>("alice"));
    persons.emplace_back(bob);
    persons.emplace_back(std::make_shared<Person>("carol"));
    persons.emplace_back(bob);

    // Define a lambda for debugging output
    auto printPersons = [&] (const auto& header) {
        std::cout << header << std::endl;
        for(auto& p: persons)
            std::cout << p->name << std::endl;
    };

    printPersons("== Before ==");
    removePerson(bob);
    printPersons("\n== After ==");
}

注意:== Before == bob alice bob carol bob == After == alice carol 通常不会命名为std::vector,因为它不是列表;-)