You need to enable JavaScript to run this app. C++如何通过元素指针删除list<string>链表的对应元素
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 05:45:04