Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于如何实施的思考?_C++_Stl_Linked List - Fatal编程技术网

C++ 关于如何实施的思考?

C++ 关于如何实施的思考?,c++,stl,linked-list,C++,Stl,Linked List,我将一些非常旧的C代码移植到C++中,并且运行了一个数组内实现的链表。该元素是一个简单的结构: struct element { void *m_ptrData; short m_nextEntry; short m_prevEntry; }; 作为一个数组,如果您知道索引,就可以快速访问数据。链表特性允许元素四处移动,并从列表中“删除”。可以根据使用频率在列表中移动元素(MRU向上,LRU向下) 我想找到一种比使用另一个数组更好的实现方法。我想使用STL,但我不确定哪

我将一些非常旧的C代码移植到C++中,并且运行了一个数组内实现的链表。该元素是一个简单的结构:

struct element
{
    void *m_ptrData;
    short m_nextEntry;
    short m_prevEntry;
};
作为一个数组,如果您知道索引,就可以快速访问数据。链表特性允许元素四处移动,并从列表中“删除”。可以根据使用频率在列表中移动元素(MRU向上,LRU向下)

我想找到一种比使用另一个数组更好的实现方法。我想使用STL,但我不确定哪个容器最适合使用


有人有什么想法吗?

由于这是一个链接列表,您可能应该使用

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

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

另一方面,使用向量的优点是,它的元素在内存中是连续的,如果由于缓存的原因只需按顺序遍历它们,则可以极大地提高性能。

请参见此处:


底部有一个流程图可以帮助您选择正确的容器。

既然此列表中的数据是指针,为什么还要麻烦使用链表呢?对于小型POD,
std::vector
通常是最好的首选,而且由于其数据的更好的局部性与处理器缓存的良好配合,它的性能往往超过链表,即使在理论上链表应该更好的地方。我会选择
std::vector
,直到一些评测显示存在性能问题,并且
std::list
的性能更好

随机访问速度至关重要吗?我的意思是,相对于迭代,它是否经常发生?它完全取决于其他代码如何使用它。直接访问是访问元素的常见方式,还是主要通过单步遍历列表来实现?有些元素的访问频率比其他元素高吗?我曾经读过一篇文章,文章声称(并为之辩护)认为
std::vector
几乎总是比
std::list
更好的选择,即使您正在容器中间添加/删除项。我现在找不到这篇文章,所以我把它作为评论而不是回答。如果其他知道这篇文章的人能发布一个链接,我将不胜感激。@Michael Burr:这几乎总是取决于你需要添加/删除项目的频率,一次需要添加/删除多少项目,以及之后如何处理容器。@Dima:我不知道有任何特定的文章,但从我自己和其他人的经验来看,如果复制足够便宜,
std::vector
几乎总是比
std::list
好,即使理论上不应该这样。如果只存储指针,则肯定是这样。见我的答案。直接访问是最常见的access@kberson注意。该std::list不支持通过索引直接访问。需要能够仅通过索引直接访问元素。需要能够移动元素,所以STL::向量不起作用。@ KBERSON:如果它使用一个数组,那么它肯定会与一个STD::vector…@ KBERSON:注意到,不是代码< STD::向量< /代码>不可能在中间插入元素。因为插入点之后的所有元素都必须移动。