C++如何通过元素指针删除list<string>链表的对应元素
核心结论先明确
标准库的std::list内部节点结构是未对外暴露的,你自定义的node_t和STL list的内部节点完全无关,你设想的void delete(node_t *list_ptr, node_t *p)函数签名完全不可行,你能拿到的只有你存储的std::string元素本身的指针,拿不到内部链表节点的指针。
1. 通过元素指针删除list元素是否可行?
可行,但是有两个前提:
- 指针必须确实指向当前list中未被删除的元素,不能是其他容器的元素或者野指针
std::list的元素存储地址是稳定的,只要元素没有被删除,地址就不会变化,所以可以通过比对地址找到对应元素的迭代器,再调用erase方法删除
2. 如何获取单个list元素的指针?
拿到元素的迭代器之后,解引用再取地址即可,示例代码如下:
std::list<std::string> list_ptr = {"1", "2", "3", "4", "5", "6", "7", "8"}; auto it = find(list_ptr.begin(), list_ptr.end(), "4"); if (it != list_ptr.end()) { std::string* elem_ptr = &(*it); // 这里获取到的就是元素本身的指针 }
3. 完整实现通过元素指针删除元素的函数
#include <list> #include <string> // 入参是list的引用、待删除元素的指针 void delete_list_elem(std::list<std::string>& str_list, std::string* target_ptr) { for (auto iter = str_list.begin(); iter != str_list.end(); ++iter) { if (&(*iter) == target_ptr) { str_list.erase(iter); return; } } // 没找到对应元素的错误处理逻辑可根据自己需求补充 } // 调用示例 int main() { std::list<std::string> list_ptr = {"1", "2", "3", "4", "5", "6", "7", "8"}; auto it = find(list_ptr.begin(), list_ptr.end(), "4"); if (it != list_ptr.end()) { std::string* p = &(*it); delete_list_elem(list_ptr, p); } return 0; }
性能优化提示
STL的std::list原生erase方法直接传迭代器删除的时间复杂度是O(1),如果场景允许直接传递迭代器,就不要传递指针,传指针需要遍历整个list匹配地址,时间复杂度会升到O(n),性能更差。
内容的提问来源于stack exchange,提问作者Adam Wróbel
相关产品推荐
相关产品推荐

