std::sort 不總是呼叫std::swap
問題:
問題:<code class="cpp">#include <algorithm> #include <iostream> #include <vector> namespace my_space { struct A { double a; double* b; bool operator<(const A& rhs) const { return this->a < rhs.a; } }; void swap(A& lhs, A& rhs) { std::cerr << "My swap.\n"; std::swap(lhs.a, rhs.a); std::swap(lhs.b, rhs.b); } } int main() { const int n = 20; std::vector<my_space::A> vec(n); for (int i = 0; i < n; ++i) { vec[i].a = -i; } for (int i = 0; i < n; ++i) { std::cerr << vec[i].a << " "; } std::cerr << "\n"; std::sort(vec.begin(), vec.end()); for (int i = 0; i < n; ++i) { std::cerr << vec[i].a << " "; } std::cerr << "\n"; }
問題:
問題:
<code class="cpp">typename iterator_traits<_RandomAccessIterator>::value_type __val = _GLIBCXX_MOVE(*__i); _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1); *__first = _GLIBCXX_MOVE(__val);</code>在下面的程式碼中,為什麼在較小範圍(n=4)執行std::sort 時未呼叫自訂交換函數,即使在較大範圍(n=20)中呼叫它? 答案:對於小範圍,GCC 的stdlibc(和其他標準庫實現)中的std::sort 實現出於性能原因使用插入排序。插入排序不使用 std::swap 來交換元素。相反,它一次移動整個範圍的值,可能會節省效能。 GCC 插入排序實作中的相關代碼(bits/stl_algo.h:2187,GCC 4.7.2)是:此程式碼將目前位置(__i) 的值移到到臨時存儲,將所有先前的值從__first 向上移動到__i,然後在__first 處重新插入臨時值。透過這樣做,它可以在一次操作中執行 n 次交換,而不必單獨移動 n 個值。
以上是為什麼 std::sort 不為小範圍呼叫我的自訂交換函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!