Bil*_*ham 5 c++ pointers iterator list
我有一个指针p(不是迭代器)到列表中的项目.然后我可以使用p从列表中删除(擦除)项目吗?就像是:
mylist.erase(p);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我只能够通过列表进行迭代,直到我的位置到达一个项目要做到这一点p,然后使用erase方法,这似乎是非常低效的.
Astd::list不具有关联性,因此您无法使用指针作为键来直接删除特定元素。
事实上,您发现自己处于这种情况,而不是指向有问题的设计,因为您是正确的,从集合中删除该项目的唯一方法是完全迭代它(即线性复杂度)
以下可能值得考虑:
如果可能,您可以将列表更改为 a std::multiset(假设有重复的项目),这将使直接访问更加高效。
如果设计允许,请更改您指向的项目以合并“已删除”标志(或使用模板来提供此标志),这样您就可以避免从集合中删除该对象,但可以快速将其标记为已删除。缺点是您的所有软件都必须更改以适应此约定。
如果这是唯一的线性搜索,并且集合不大(例如 <20 项)。为了方便起见,只需按照您的建议进行线性搜索,但在代码中留下一个大注释,指示您如何“完全明白“这是多么低效。” 您可能会发现,在任何情况下,这在一段时间内都不会成为一个切实的问题(如果有的话)。
我猜 3 可能是你最好的选择。:)