我有一个包含 600 个值的 96 个块的 2D 向量,这就是我想要的。
我需要删除不包含足够能量的(块)。我已经设法计算了能量,但不知道哪种方法可以更好地去除不包含足够能量的(块)。
在您看来,创建一个临时 2D 向量会更好,它会推回确实包含足够能量的块,然后从内存中删除原始向量,或者......
我应该从该特定位置的向量中删除块吗?
我假设你有这个:
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
它返回生命尽头的“垃圾”点。然后我们清除垃圾。这称为remove-erase idiom。
也许您想使用链表,或者只是将过滤掉的项目设置为 NULL,或者用 bool 成员标志标记它们,或者保留一个单独的过滤项目索引向量(如果您同时有多个过滤器,这可以节省内存) .
解决方案因约束条件而异。你需要随机访问吗?对象复制需要多少?等等。
您还可以查看 STL 代码(这是 STL 的向量,对吗?)并检查它是否符合您的要求 - 即复制向量数据。
这部分取决于在这种情况下如何更好地定义。任何一种方法都可能有优势,但很难确切地知道它们是什么。最有可能的是,就内存和处理性能而言,从向量中删除您不想要的确切位置而不是分配一个全新的位置可能会稍微“更好”。为此目的考虑使用双端队列或列表可能会更好,因为它们可以避免向量在尝试保持连续的内存段时可能进行的大量重新分配。