【发布时间】:2012-01-03 09:46:25
【问题描述】:
我很难找到一个好的答案。出于某种原因,我认为 STL 排序将使用交换实现以更好地支持复杂类型,但当我最终深入研究代码时,它似乎实际上是在进行二进制复制。有人可以证实这一点吗?我猜二进制副本实际上比交换更受欢迎。
附带问题:是否有任何 STL 算法或容器操作使用交换实现? (很明显,在std::swap 之外。)我想知道何时谨慎地实现我自己的复杂类型交换。
编辑:我问的原因是你是否有类似的东西:
class MyClass {
vector<int> vec_data;
int a;
int b;
}
vector<MyClass> my_vec;
sort(my_vec.begin(), my_vec.end(), MyCustomCompare);
我想确保排序没有调用向量的复制构造函数,如果您调用 MyData 的默认复制构造函数,就会发生这种情况。因此我的问题是排序调用交换、复制分配等?
【问题讨论】:
-
您可能正在查看用于整数(或其他本机)类型的
sort特化。 -
将
std::sort专门用于POD类型会聪明。但是,不允许对所有类型进行二进制复制。 -
你真的在谈论 STL 吗?
-
@tamulj:如果人们想学究气,“STL”就是原始的 STL。作为标准化过程的一部分,它在 C++ 标准中进行了微小的更改。虽然 C++ 标准并未将标准库的该部分称为 STL,但这通常是 C++ 程序员所说的 STL 的意思。
-
@tamulj,您可以阅读有关 STL 与 C++ 标准库的术语here。