Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++;STL数据结构常数时间Push/Pop/Random Access by Index,带可靠的元素指针 我一直在浏览C++ STL,我不确定哪个数据结构最适合这个特定的用例。它需要能够在固定时间内完成以下三件事: 按索引进行的固定时间随机访问(因此可以在固定时间内选择随机元素) 仅在末尾进行恒定时间推/弹出 推/弹出时,指向包含项的指针不能无效(不关心迭代器)_C++_C++11_Data Structures_Stl_Time Complexity - Fatal编程技术网

C++;STL数据结构常数时间Push/Pop/Random Access by Index,带可靠的元素指针 我一直在浏览C++ STL,我不确定哪个数据结构最适合这个特定的用例。它需要能够在固定时间内完成以下三件事: 按索引进行的固定时间随机访问(因此可以在固定时间内选择随机元素) 仅在末尾进行恒定时间推/弹出 推/弹出时,指向包含项的指针不能无效(不关心迭代器)

C++;STL数据结构常数时间Push/Pop/Random Access by Index,带可靠的元素指针 我一直在浏览C++ STL,我不确定哪个数据结构最适合这个特定的用例。它需要能够在固定时间内完成以下三件事: 按索引进行的固定时间随机访问(因此可以在固定时间内选择随机元素) 仅在末尾进行恒定时间推/弹出 推/弹出时,指向包含项的指针不能无效(不关心迭代器),c++,c++11,data-structures,stl,time-complexity,C++,C++11,Data Structures,Stl,Time Complexity,最初,我尝试使用向量;它完全满足前两个标准。然而,我了解到,当你把新的项目推到向量上时,指向它的元素的指针将失效,因为向量会重新定位自身,以保持其所有内存的连续性。尽管提前使用vector的reserve()方法可以解决这个问题,但问题是它需要知道我可能需要存储在其中的最大数量的元素,而这不是我提前知道的值,我也无法真正计算它。我也不能在大小变大时再次使用reserve,因为这样指向向量元素的指针仍然会失效 然后我试了一杯德克。信不信由你,deque实际上完美地满足了这三个标准。指向元素的指针不

最初,我尝试使用向量;它完全满足前两个标准。然而,我了解到,当你把新的项目推到向量上时,指向它的元素的指针将失效,因为向量会重新定位自身,以保持其所有内存的连续性。尽管提前使用vector的
reserve()
方法可以解决这个问题,但问题是它需要知道我可能需要存储在其中的最大数量的元素,而这不是我提前知道的值,我也无法真正计算它。我也不能在大小变大时再次使用reserve,因为这样指向向量元素的指针仍然会失效

然后我试了一杯德克。信不信由你,deque实际上完美地满足了这三个标准。指向元素的指针不会因推/弹出而失效,推/弹出是恒定时间。然而,我注意到这是有代价的;deque的速度大约是矢量的两倍。我知道deque具有将项目放在最前面的附加功能,这对我来说是不必要的,我不确定是这种附加功能还是并非所有内存都是连续保存的这一事实导致了减速。


<> Pr>当DEQO满足这三个标准时,C++中的STL中有数据结构可以做得更好吗?或者可能是一个向量的解决方案,以防止指针失效?你认为呢?

你基本上需要一个
std::deque
,然而
std::deque
是基于
std::vector
的,如果达到容量,必须分配一个新的连续内存块(),它会使所有迭代器失效。因为您不关心迭代器无效,所以这不应该困扰您,而且
std::deque
结构对于您的用例来说已经足够了。看一看这张照片。但是,如果你只想拥有一个<代码> PUP/POP 接口,请考虑编写一个包装器。

首先,没有STL之类的东西,或者更确切地说,你不想处理所谓的STL。您对C++标准库感兴趣。第二,在C++标准库中有非常小的容器,并且测试它们的时间很短(并且要确信你想要的是一个独角兽)。在标准库中,DeQE是唯一的选择。如果您发布了这个需求,那么也许您可以为自己的目的创建一个定制容器,这比deque更快。您是否绑定到指向元素的指针?当您仅追加时,元素的索引不会更改,因此您可以存储该索引,而不是将追加/预追加到
deque
是常量时间
vector
只是摊销常量追加。你是对的,但是我不相信它,因为每个stl实现在时间复杂性方面都不是标准的遵从性。我删除了我添加的内容,谢谢:)