关于如何实施的想法?

时间:2010-12-10 18:55:03

标签: c++ stl linked-list

我正在将一些非常旧的c代码移植到c ++中,并且我遇到了在数组中实现的链表。元素是一个简单的结构:

struct element
{
    void *m_ptrData;
    short m_nextEntry;
    short m_prevEntry;
};

作为数组,如果您知道索引,则可以快速访问数据。链接列表方面允许元素移动,并从列表中“删除”。可以根据使用频率在列表中移动元素(MRU为LRU,LRU为向下)。

我喜欢找到比使用其他数组更好的方法来实现它。我想使用STL,但我不确定哪种容器最好用。

有人有任何想法吗?

3 个答案:

答案 0 :(得分:10)

由于这是一个链表,您应该使用std::list ...

经验法则是,当您需要在列表中的随机位置插入元素或从列表中删除随机元素时,您希望使用链接列表。如果您主要需要在列表末尾添加/删除元素,那么您应该使用std::vector。如果您需要在列表的开头或末尾添加/删除元素,那么您应该使用std::deque

请记住,我们在这里讨论概率。如果你需要在一个蓝色的月亮中将一个元素插入std::vector的中间,那可能就行了。但是如果你需要一直这样做,它会对性能产生重大影响,因为向量需要不断移动它的元素,并且可能也会重新分配它的内存。

另一方面,使用向量的优点是它的元素在内存中是连续的,如果你只是因为缓存需要按顺序遍历它们,这会大大提高性能。

答案 1 :(得分:4)

由于此列表中的数据是指针,为什么还要使用链表呢?对于小POD,std::vector通常是最好的第一个赌注,并且由于其数据的更好的局部性与处理器缓存很好地协作,它经常超出链表,即使在理论上,链表应该更好。我会选择std::vector,直到某些分析会显示存在性能问题且std::list表现更好。

答案 2 :(得分:3)

见这里:

http://linuxsoftware.co.nz/cppcontainers.html

有一个流程图可以帮助您在底部选择合适的容器。