用于随机访问列表的STL容器?

时间:2012-09-24 16:08:37

标签: c++ stl

是否存在类似于列表的STL容器,列表元素不会连续存储?此容器的大小最多可达1000x1000个元素,每个元素是一个包含36个双精度数的向量。这将是一个很大的块存储在一起(如约200兆字节)。是否存在一种变体,它将指向其内容的指针存储为单独的向量,以便允许随机访问。是否存在已存在的STL容器类,或者我是否应该手动存储指针?

我需要的容器实际上是一个恒定的大小所以我认为自己实现它不会太困难,但我想知道是否已经存在STL容器。我想避免使用矢量,因为列表很大,内容中等。如果容器中的向量不需要彼此相邻,那么在列表中将它们分开是不是更好,以防止碎片耗尽内存?

3 个答案:

答案 0 :(得分:1)

deque<array<double, 36>>vector<vector<double>>都可以避免任何真正巨大的连续分配。

vector<vector<double>>在这些方面更糟糕。对于您指定的数字,它需要连续分配1000*1000*sizeof(vector<double>),这是MB的低10(很可能vector是3个指针的大小)。这在“适当的计算机”(桌面或服务器)上很少出现问题。由于碎片原因(小的虚拟地址空间或根本没有虚拟寻址)而引起关注的地方,您可能还有一个更基本的问题,即无论如何都没有300MB的RAM。但是你可以通过避免它来发挥额外的安全性,因为很明显存在可以分配总共300MB而不是12MB连续的环境。

C ++ 03中没有std::array,但有boost::array或者您可以轻松编写一个类来代表36个双打。

vector<array<double, 36>>受碎片影响最严重,需要连续250 MB的分配。就个人而言,我觉得在测试“我们将遇到的最糟糕的内存碎片”时并不容易模拟,但我不是最好的测试人员。块的大小是关于我在32位进程中感觉有点不安的地方,但它会在良好的条件下正常工作。

答案 1 :(得分:0)

我强烈建议您使用std::array课程。它是恒定大小的,它支持对所有元素的随机访问,并具有iterator, const_iterator, reverse_iterator, const_reverse_iterator的实现。更多相关信息:http://www.cplusplus.com/reference/stl/array/

答案 2 :(得分:0)

目前尚不清楚你究竟是std::list<T>的特征。如果您想要一个在添加或删除元素时其元素保持不变的容器,您可能需要查看std::deque<T>:在前面或后面添加/删除元素时,所有其他元素都保留在同一位置。也就是说,指向元素的指针和引用保持有效,除非在中间添加或删除元素。迭代器在任何插入或删除时都会失效。 std::deque<T>提供随机访问权。

没有任何容器可以直接获得随机访问权限,并且支持添加/删除任何有关保留元素的pohtion。然而,正如其他人所指出的那样,使用指针容器提供了这样的接口。可能需要将其包装起来以隐藏指针的使用。