假设我需要迭代一个可能非常大的数字向量,并将偶数元素和奇数元素复制到新的、单独的向量中。(源向量可能包含任何比例的偶数和奇数;它可以全是偶数,全是奇数,或者介于两者之间。)
为了简便起见,通常使用
然而,我担心如果它被用作类似于排序算法实现的一部分,那么这将是低效的,并且会有害。例如,QuickSort 就像这样分离元素。
您可以使用 reserve() 预先分配内存,以便只需要一个分配,但是然后您必须两次迭代整个源向量 - 一次计算需要排序的元素数量,一次进行实际复制。
当然,您可以分配与源向量大小相同的空间,因为两个新向量都不需要容纳更多的元素,但这似乎有些浪费。
我是否遗漏了更好的方法?程序员通常信任 push_back() 来管理这种情况吗?或者对于敏感算法来说,它可能会变得繁琐吗?
为了简便起见,通常使用
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]);
}
然而,我担心如果它被用作类似于排序算法实现的一部分,那么这将是低效的,并且会有害。例如,QuickSort 就像这样分离元素。
您可以使用 reserve() 预先分配内存,以便只需要一个分配,但是然后您必须两次迭代整个源向量 - 一次计算需要排序的元素数量,一次进行实际复制。
当然,您可以分配与源向量大小相同的空间,因为两个新向量都不需要容纳更多的元素,但这似乎有些浪费。
我是否遗漏了更好的方法?程序员通常信任 push_back() 来管理这种情况吗?或者对于敏感算法来说,它可能会变得繁琐吗?
std::sort()
的实现,它确实是原地排序。 - Benjamin Lindley