从2D矢量中删除矢量

时间:2012-11-12 17:54:20

标签: c++ vector

我有一个包含96个600个值的块的2D矢量,这就是我想要的。

我需要移除(块)不足够的能量。我已经设法计算能量,但不知道哪种方法可以更好地去除不足够能量的(块)。

在你的意见中,最好是创建一个临时的2D矢量,它会推回包含足够能量的块,然后从内存中删除原始矢量或...

我应该从该特定位置的矢量中移除块吗?

3 个答案:

答案 0 :(得分:2)

我假设你有这个:

typedef std::vector<value> Block;
typedef std::vector< Block > my2dVector;

你有这样的功能:

bool BlockHasInsufficientEnergy( Block const& vec );

并且您想删除没有足够能量的块。

通过删除,你的意思是你希望之后少于96个块吗?我会假设。

然后正确的方法是:

void RemoveLowEnergyBlocks( my2dVector& vec )
{
  my2dVector::iterator erase_after = std::remove_if( vec.begin(), vec.end(), BlockHasInsufficientEnergy );
  vec.erase( erase_after, vec.end() );
}

上面的内容可以在一行中完成,但是通过两行来完成后应该更清楚。

remove_if找到通过第三个参数条件的所有内容,并将其过滤掉。它返回vector末尾的“垃圾”所在的点。然后我们擦掉垃圾。这被称为删除 - 删除习语。

答案 1 :(得分:0)

也许你想要使用链表,或者只是将过滤后的项目设置为NULL,或者用bool成员标志标记它们,或者保留一个单独的过滤项目索引向量(如果你有多个过滤器一次这个节省记忆)。

解决方案因限制因素而异。你需要随机访问吗?对象复制需要多少?等

你也可以看一下STL代码(这是STL的向量,对吗?)并检查它是否符合你的要求 - 即复制矢量数据。

答案 2 :(得分:0)

这部分取决于你在这种情况下如何更好地定义。任何一种方法都可能有优势,但很难确切知道它们是什么。最有可能的是,就内存和处理性能而言,从向量中删除不需要的确切位置而不是分配一个全新的位置可能有点“更好”。 考虑为此目的使用deque或列表可能更好,因为它们可能会避免在尝试保留连续的内存段时向量可能会进行的大量重新分配。