[英]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.