如何解决从向量中按内存地址删除共享指针
我有一个包含共享指针的向量。我想通过使用其内存地址从列表中删除一个指针,这可能吗?还是有更好的方法来存储共享指针的集合?
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
,因为它不是列表;-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。