c++ - 从向量中按内存地址删除共享指针
问题描述
我有一个包含共享指针的向量。我想通过使用它的内存地址从列表中删除一个指针,这可能吗?还是有更好的方法来存储共享指针的集合?
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
注意: Astd::vector
通常不会被命名list
,因为它不是一个列表;-)
推荐阅读
- arrays - 我应该在将对象发送到服务器之前清理它们吗
- java - Apache Spark Java - Pi 估计示例编译问题
- android - NUnit 测试项目 - 无法创建 Xamarin MockContext - 找不到 java-interop
- python - python:递归函数不返回真或假
- javascript - C3散点图显示所有tcks
- reactjs - 在 Typescript 中,如何确保 React 子组件属于某种类型
- python - 如何解决numpy矩阵乘法错误
- unzip - 如何删除解压缩后出现在 PHP/CSS/JS 文件中的不需要的“额外换行符”?
- postgresql - 将间隔日添加到来自 postgresql 的日期
- javascript - $.fn.dataTable.ext.search.push 在 on(change) jquery 内部不起作用