std::deque or std::list
std::deque or std::list
我只使用push_front()
和push_back()
。因此,我不会产生使用insert()
或remove()
的任何其他费用。
我知道这两个容器都为这些功能中的每一个提供了O(1)
复杂性,deque
具有摊销恒定时间与list
具有恒定时间相比。
但我想知道哪个时间比另一个时间少,如果有的话。
不知道如何回答你的问题。 您似乎希望我们编写一个您自己可以轻松编写的基准程序。 因此,我不会这样做,而只是声明这一点:
- 使用
list
时,您推送的每个项目都会产生内存分配。 - 有了
deque
,大块被立即分配。
鉴于内存分配通常很慢,我预计deque
会跑赢列表。
如果一次推送或弹出多个项目,则尤其如此,因为缓存局部性开始发挥作用。
当然,您可以在列表中编写分配器以使用内存池。 然后,您可能会获得更好的性能。
因此,考虑到这些假设,走开并衡量它,如果你想讨论结果,那就是提出问题的时候了。
每当涉及到性能时,"猜测"(或在互联网上询问,这比猜测略好,但只是有点好)是一个坏主意,并且总是最好衡量这两个选项 - 在这种情况下,只需做一个循环,push_back或push_front足够多的东西来使其现实[您可能希望使其更真实并运行代码的大部分功能, 并在循环中这样做,使其持续足够长的时间来测量时间 - 这通常比向list
/deque
添加大量值然后发现"当你必须换出时,它会变得非常慢!
相关文章:
- 使用std::multimap迭代器创建std::list
- 使用"std::unordereded_map"映射到"std::list"对象
- 使用std::list创建循环链表
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 包含 std::list 的结构体的 C++ 初始化
- 在基于范围的 for 循环期间插入 std::list 的后面
- 循环挂起迭代的 std::擦除 on std::list
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- std::list 中的迭代器感知对象
- std::list 可以用于简单的无锁队列吗?
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- C++11 基于范围的 for 循环,用于 std::list
- 向 std::list 添加新元素的复杂性
- 如何使用 std::list 模板的迭代器擦除
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 如何将文件的一部分读取到std::list缓冲区?
- 抽象和派生与std::list相结合
- std::list 的两个 insert() 方法签名之间的实现差异
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?