0

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

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

4

3 回答 3

1

两者都deque<array<double, 36>>vector<vector<double>>避免需要任何真正巨大的连续分配。

在这些vector<vector<double>>方面更糟。对于您指定的数字,它需要连续分配1000*1000*sizeof(vector<double>),这是低 10 秒的 MB(很可能 avector是 3 个指针的大小)。这在“适当的计算机”(台式机或服务器)上很少出现问题。由于碎片原因(小虚拟地址空间或根本没有虚拟地址),您可能还会遇到更根本的问题,即您没有 300MB 左右的 RAM。但是你可以通过避免它来玩得更安全,因为显然存在可以分配总共 300MB 但不能连续分配 12MB 的环境。

C++03中没有std::array,但是有boost::array或者你可以很容易地编写一个类来表示 36 个双精度数。

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

于 2012-09-24T16:54:11.110 回答
0

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

于 2012-09-24T16:16:34.763 回答
0

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

没有容器直接给予随机访问并支持在任何位置添加/删除元素保持不变。但是,正如其他人指出的那样,使用指针容器提供了这样的接口。可能需要包装它以隐藏指针的使用。

于 2012-09-24T17:03:16.063 回答