池容器的最佳数据结构是什么?

发布于 2024-11-28 14:11:27 字数 170 浏览 0 评论 0原文

目前,我使用 STL 矢量容器模板来放回和获取连接。

1) 在获取时,返回一个连接并从池向量中“erase()”d。

2) 释放时,连接通过“push_back()”交回池。

如果经常使用泳池,这可能会很重。所以我的问题是,有没有办法通过切换到其他数据结构来提高这里的性能?

At the moment i use the STL vector container template to put back and get the connections.

1) on get, a connection is returned and "erase()"d from pool vector.

2) on release, the connection is handed back to the pool via "push_back()".

This might be very heavy if the pool is frequently used. So my question is, is there any way to improve the performance here by switching to an other data structure?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼眸印温柔 2024-12-05 14:11:27
  • 如果只在后面追加并从后面擦除,vector 就可以了。
  • 如果您从前面和后面追加和删除,但从不从中间追加和删除,请使用deque
  • 如果您经常必须在中间插入和删除,请使用list
  • 根据您的查找和遍历要求,set 可能是一种替代方案。

无论如何,您都应该分析性能;对主容器使用 typedef,以便您可以快速切换和测试不同的选项。

可能还有其他您没有告诉我们的要求,但这些要求对于容器的选择很重要:

  • 向量和双端队列是随机访问容器;列表和集合是基于节点的。这会影响迭代器失效。
  • Vector、deque、list是序列容器,而set是关联的;这会影响按值查找。
  • If you only append at the back and erase from the back, vector is fine.
  • If you append and erase from both front and back, but never from the middle, use deque.
  • If you frequently must insert into and erase from the middle, use list.
  • Depending on your lookup and traversal requirements, set might be an alternative.

In any case, you should profile the performance; use a typedef for your main container so you can quickly switch and test the different options.

There may be other requirements which you aren't telling us but which are important for the choice of container:

  • vector and deque are random-access containers; list and set are node-based. This affects iterator invalidation.
  • vector, deque and list are sequence containers, while set is associative; this affects lookup by value.
枯叶蝶 2024-12-05 14:11:27

std::vector 可能是池的最佳容器。插入的时间复杂度为 O(1),如果不需要维持顺序,删除也可以为 O(1)。您可以仅交换最后一个项目并删除该项目并缩小向量。此外,与其他容器相比,std::vector 的空间效率相当高。低内存消耗还意味着更好的性能,因为 CPU 缓存命中率更高。

std::vector is probably the best container for pool. O(1) for insertion and you can also have O(1) for removal if you don't need to maintain order. You can just swap the last item with the item removed and shrink the vector. Also std::vector is pretty space efficient compared to other containers. Low memory consumption also means a better performance because of more CPU cache hits.

始终不够 2024-12-05 14:11:27

如果您提前知道可能的最大连接数,请保留向量(请参阅向量::保留)。

否则使用 std::list。

最后,它还取决于您的平台以及所使用的编译器和 libstdc++ 的版本。

Keep vector if you know the maximum number of connections possible in advance (see vector::reserve).

Otherwise use std::list.

At the end it also depends of your platform and the version of the compiler and libstdc++ used.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文