首页 > 解决方案 > 从向量中按内存地址删除共享指针

问题描述

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


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());
    }

标签: c++pointersvector

解决方案


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

虽然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

注意: Astd::vector通常不会被命名list,因为它不是一个列表;-)


推荐阅读