在矢量之间共享元素的想法

时间:2011-04-29 18:18:27

标签: c++ c data-structures

我正在研究玩具语言,以下是我正在尝试做的事情,

x = [1 2 3 4 5]

这定义了一个矢量,然后

y = rest(x)

现在y包含除x之外的所有x元素。在原生方面,x是一个向量,当用户调用rest时,它将自制一个完整的副本,除了第一个元素。这是问题我只有2 kb的ram,使得完整的副本很昂贵。使用链接列表可以解决这个特定的问题,但如果在此上下文中存储器占用,则链接列表自己。那么,是否存在一种内存效率高的结构,用于共享元素的这类操作(第一个休息是最常见的操作)?

这是一种函数式语言,因此一旦定义x就不会改变,也没有可用的boost或std c ++库,我将实现所有内容。

2 个答案:

答案 0 :(得分:2)

由于你的内存受限,我能想到的最好的解决方案是使用指向第一个元素的指针。很难想象可以有更节省空间的解决方案。

答案 1 :(得分:2)

您可以将[1, 2, 3, 4, 5]存储在某个内存中,并使x指向该内存,即

template <typename T>
struct slice { T* begin; T* end; };

....

int backing_store[] = {1, 2, 3, 4, 5};
// ^-- the expression [1 2 3 4 5] create this

....

slice<int> x (backing_store, backing_store + 5);
// ^-- the assignment x = [1 2 3 4 5] does this

然后您可以将rest实现为

template <typename T>
slice<T> rest(slice<T> p) {
   return slice<T>(p.begin + 1, p.end); 
}

您可以使用一些引用计数方案或GC(可能对您的内存来说太大)确保在没有“切片”使用它时释放backing_store