【发布时间】:2018-12-13 01:34:36
【问题描述】:
让v 成为一个向量。我希望w 成为索引from 和to 之间v 的子集。我可以这样做
std::vector<T> w(v.begin() + from, v.begin() + to);
但是,我以后不打算使用v。因此,我不需要在from 和to 之间复制数据。我需要创建一个指向v.begin() + from 并且长度为to - from 的向量。 v 使用的其余内存应该被释放。请注意,如果 v 被重新定义,我很好(如果我愿意,我可以在之后切换到 w)。
有可能吗?
【问题讨论】:
-
关于你是否应该使用
std::deque的问题,这完全取决于你如何使用这个向量。请记住,双端队列的存储在内存中是不连续的。此外,双端队列使用的内存量通常大于向量使用的内存量,这削弱了您关于需要释放范围之外的部分内存的观点。使用双端队列,您对此没有太多控制权。 -
@paddy 是的,我意识到没有足够的信息来回答这个额外的问题。我删除了
SHould I use a dequefrmo 我的帖子。仅供参考,我的意思是对这些向量进行很多子集化,有时需要复制,有时则不需要。我还需要快速(如果可能,恒定时间)查找。 -
我怀疑vector是否可行:vector的内部只是一大块连续内存,我怀疑你有什么办法只释放部分内存块。想想看:如果你有
int* foo = new int [1000];,有什么办法可以释放,比如说,从foo[0]到foo[50]?恕我直言,这是不可能的 -
如果您编写自己的内存分配器,可以分割一个块并返回它周围的部分,这是可能的。尽管可能无法将该分配器与向量一起使用。当然,如果针对像这样的非常具体的要求进行工程设计,那可能是您需要采用的方式,以及您自己的容器来包装该功能。请注意,与使用标准分配器和少量复制相比,这可能会导致更多的内存碎片。
-
@Remi.b 您可以在我的 deque 答案中看到一些您可能已经知道的 deque 详细信息。 paddy 对是否需要连续分配的担忧是正确的,但性能应该几乎完全相同,因为查找是常数时间,只有两个间接,仅比向量多 1,并且取决于双端队列的桶的大小,您在前后存储桶上保留的最大浪费内存量。我敢说,在我现在能想到的几乎所有 PC 情况下,我都会使用双端队列。
标签: c++ vector containers move