假设我必须遍历一个可能非常大的数字向量,并将偶数和奇数元素复制到新的单独向量中。(源向量可能具有任何比例的偶数与赔率;它可能是所有偶数、所有赔率或介于两者之间的某个位置。)
为简单起见,push_back
常用于此类事情:
for (std::size_t Index; Index < Source.size(); Index++)
{
if (Source[Index] % 2) Odds.push_back(Source[Index]);
else Evens.push_back(Source[Index]);
}
但是,我担心如果将其用作性能至关重要的排序算法之类的实现的一部分,这将是低效且有害的。例如,快速排序涉及分离元素,就像这样。
您可以使用reserve()
预先分配内存,因此只需要一次分配,但随后您必须对整个源向量进行两次迭代 - 一次计算需要排序的元素数量,再一次用于实际复制。
当然,您可以分配与源向量大小相同的空间,因为新向量都不需要容纳更多空间,但这似乎有点浪费。
我错过了更好的方法吗?通常可以信任为push_back()
程序员管理这类事情,还是会成为敏感算法的负担?