如何判断unique_ptr与vector迭代器是否指向同一个对象
解决方案
方案1:直接使用erase(推荐)
你已经拿到了指向待删除元素的有效迭代器,完全不需要调用remove_if,直接调用vector的erase方法就可以完成删除,代码更简洁,时间复杂度也更低:
void World::remove_organism(organism_iterator organism_to_delete) { organisms_vector.erase(organism_to_delete); }
这个方法直接删除迭代器指向的单个元素,不需要遍历整个容器,完全匹配你的需求。
方案2:如果确实需要用remove_if实现(比如有批量删除的扩展需求)
如果你有特殊场景必须使用remove_if来实现,那可以提前取出待删除元素对应的裸指针,在回调中比对裸指针即可。因为unique_ptr是独占所有权的智能指针,同一个裸指针只会对应容器里的一个unique_ptr实例,比对是安全的:
void World::remove_organism(organism_iterator organism_to_delete) { // 先取出待删除对象的裸指针作为比对依据 Organism* target = organism_to_delete->get(); auto new_end = remove_if(begin(organisms_vector), end(organisms_vector), [target](const unique_ptr<Organism>& potential_organism_to_del) { return potential_organism_to_del.get() == target; }); // 注意remove_if只是把要删除的元素移到末尾,需要调用erase真正释放 organisms_vector.erase(new_end, end(organisms_vector)); }
注意事项
remove_if本身不会删除容器元素,只是将符合删除条件的元素移动到容器末尾,返回新的逻辑尾迭代器,必须配合erase才能真正删除元素释放空间- 不要尝试直接比对迭代器:
remove_if的回调参数是元素本身的引用,没有对应的迭代器信息,所以无法在回调里直接和传入的迭代器做比对,通过裸指针比对是最直接的方案
内容的提问来源于stack exchange,提问作者Michał Turek
相关产品推荐
相关产品推荐

