簡體   English   中英

從向量中通過內存地址刪除共享指針

[英]Delete shared pointer by memory address from vector

我有一個包含共享指針的向量。 我想通過使用其內存地址從列表中刪除一個指針,這可能嗎? 或者有沒有更好的方法來存儲共享指針的集合?


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

是的,可以通過地址從指針容器中刪除指針。

雖然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通常不會被命名為list因為它不是列表 ;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM