是否使用类实例或std :: shared_ptr

时间:2019-01-22 11:09:00

标签: c++ c++11 std

我有一个地图,其中存储了针对不同端口的攻击。现在,我对于如何将攻击详细信息存储为值感到困惑。此外,一个端口可能会受到多种攻击。

AttackDetails是一个结构,其中包含每种攻击的各种详细信息。

现在我有两种方法来绘制地图:

std::map <int, std::list<AttackDetails>>
std::map <int, std::list<<std::shared_ptr<AttackDetails>>>

不会有太多的插入或删除操作,但是会在地图中大量搜索端口。请告诉我,这些解决方案中是否存在重大性能问题?

我需要在删除攻击详细信息的同时访问列表,在其中我需要遍历列表并找到相似的攻击ID并停止该特定攻击。

2 个答案:

答案 0 :(得分:2)

由于您似乎只需要AttackDetails本身,而不仅仅是用RAII语义管理其生命周期的人,我认为

std::map<int, std::list<AttackDetails>>

std::map<int, std::list<<std::shared_ptr<AttackDetails>>>更可取。

类似的概念在 C ++核心指南R.30中进行了说明,如下所示。 尽管这与当前问题并不完全相同,但是应该与我们分享这种观点:

  

R.30:仅将智能指针作为参数来明确表达生命周期的语义

     

原因如果该功能仅需要小部件本身,则接受指向小部件的智能指针是错误的。它应该能够接受任何窗口小部件对象,而不仅仅是那些由特定类型的智能指针管理其寿命的窗口小部件对象。不影响生命周期的函数应改用原始指针或引用。


...对此有更好的解决方案吗?

  • 如果不需要按键对元素进行排序,请使用std::unordered_map

  • std::list的元素分散在内存中。因此,它的访问操作通常会导致高速缓存未命中,并显示较差的性能。即使用std::list::erase擦除其中的任何单个元素都具有O(1)的复杂度,访问性能也要慢得多,有时使用其他STL容器也很有意义。我建议您测试性能并比较std::liststd::vectorstd::deque之间的结果。

答案 1 :(得分:0)

您是否需要AttackDetails实例的共享所有权?如果没有,那么您不应该使用std::shared_ptr

如果您要优化搜索性能,请考虑使用诸如unordered_map之类的哈希数据结构(或更快的第三方解决方案),因为这样会将您的复杂性从O(log N)降低到{ {1}}。