【发布时间】:2020-10-16 23:05:14
【问题描述】:
我有一个包含共享指针的向量。我想通过使用它的内存地址从列表中删除一个指针,这可能吗?或者有没有更好的方法来存储共享指针的集合?
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());
}
【问题讨论】:
-
“它的内存地址”是指指针的值(即shared_ptr指向的Person对象的内存位置),还是指针的地址(即shared_ptr的内存位置对象本身,位于向量的内部项目数组内)?
-
如果您想按值快速查找,
std::set或std::unordered_set将分别为您提供O(log(N))和O(1)查找时间,两者都比O(N)按值查找快得多std::vector的时间(尽管只有当您维护的 shared_ptrs 数量很大时,性能差异才会明显,例如数百/数千或更多) -
这不是调用
list.erase删除所有要删除的项目吗? -
list.erase(remove);应该被调用以从向量中删除单个项目。 -
这可能吗?你尝试的时候发生了什么?