2012-03-19 64 views
6

是否有一些“标准”容器(STL,boost)可以将多个内存块呈现为单个连续的内存块?我需要一些数据来工作下列条件:容器将多个内存块呈现为单个连续的内存块

  • 数据的总大小是事先不知道的(网络响应)
  • 内存在大块来分配(与一些外部配置的功能,这是我无法控制的)
  • 内存释放不是由我控制的,所以重新分配是比较昂贵的

因此,让所有的数据后,我有内存块的列表。我需要将一些STL算法(搜索,复制等)作为一个整体应用于数据。有一个解决方案来编写容器来保存有关这些块+前向迭代器的信息,该迭代器可以从一个块跳转到另一个块。

但问题看起来相当普遍,所以我希望有一些我很想知道的答案。提前致谢。

回答

4

你说,内存提供给你。这听起来像你不想复制它。没问题,STL哲学非常灵活。你实际上并不需要一个容器;他们只是在那里进行内存管理,而这已经得到了照顾。

做什么需要的是一个迭代器。没有标准的;你必须自己写一个。为此提供了一个标准解决方案。但别担心,这很容易。如果您继承了std::iterator<value_type>,您将获得必要的typedef,因此您只需要编写operator*(简单明了)和operator++/operator--/operator+/operator-(了解大块)。

+0

我完全同意我需要一个迭代器,我已经提到它作为一个可能的解决方案。但是使用没有容器的迭代器对我来说看起来很奇怪。因为我应该以某种方式获得我的'begin()'和'end()',所以将这些东西封装在容器中看起来很自然。也许词_container_在这里被我滥用。我不是在谈论STL容器的概念,而是关于一些“包容器”,用于封装它们的单独的块。我只是希望自己不要实施这些东西。无论如何,谢谢你的回答。 – 2012-03-20 04:07:54

+0

“_Container_”在C++中有很好的定义(这是标准的第23章)。 – MSalters 2012-03-20 08:24:29

0

因此,让所有的数据后,我有内存块的列表。我需要将一些STL算法(搜索,复制等)作为一个整体应用于数据。有一个解决方案来编写容器来保存有关这些块+前向迭代器的信息,该迭代器可以从一个块跳转到另一个块。

这听起来像你需要一个迭代器,无缝地遍历所有的块。 std::deque<>提供了一个类似的迭代器,因为它也分块分配内存。

除非你真的需要它在一块连续的内存块中。在这种情况下,所有的块都需要复制到一个连续的内存中。