Heim  >  Artikel  >  Backend-Entwicklung  >  Warum vermeidet „std::sort“ „std::swap“ für kleine Datensätze?

Warum vermeidet „std::sort“ „std::swap“ für kleine Datensätze?

Barbara Streisand
Barbara StreisandOriginal
2024-10-25 17:41:02906Durchsuche

Why Does `std::sort` Avoid `std::swap` for Small Datasets?

std::sorts Vermeidung von std::swap mit kleinen Datensätzen

In diesem Codeausschnitt wird ein Array benutzerdefinierter Objekte erstellt und übergeben an std::sort.

<code class="cpp">std::vector<my_space::A> vec(n);
for (int i = 0; i < n; ++i) {
  vec[i].a = -i;
}

std::sort(vec.begin(), vec.end());

Die benutzerdefinierte Swap-Funktion in my_space ist definiert als:

<code class="cpp">namespace my_space
{
struct A
{
  double a;
  double* b;
};

void swap(A& lhs, A& rhs)
{
  std::cerr << "My swap.\n";
  std::swap(lhs.a, rhs.a);
  std::swap(lhs.b, rhs.b);
}
}  

Bei der Ausführung wird das folgende Phänomen beobachtet: wenn n auf 20 gesetzt ist , die benutzerdefinierte Swap-Funktion wird aufgerufen und das Array wird erfolgreich sortiert. Wenn n jedoch auf 4 gesetzt ist, wird das Array sortiert, ohne die benutzerdefinierte Swap-Funktion aufzurufen.

Dieses Verhalten ist darauf zurückzuführen, dass std::sort die Einfügungssortierung für kleine Bereiche verwendet. In der stdlibc-Implementierung von GCC wird aus Leistungsgründen die Einfügungssortierung verwendet. Folgendes passiert intern:

<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>

Dieser Vorgang ahmt n Swaps in einer schnellen Aktion nach. Daher wird die benutzerdefinierte Swap-Funktion nicht aufgerufen.

Es ist bemerkenswert, dass _GLIBCXX_MOVE std::move nur dann aufruft, wenn GXX_EXPERIMENTAL_CXX0X definiert ist. Andernfalls werden die Werte standardmäßig kopiert.

Das obige ist der detaillierte Inhalt vonWarum vermeidet „std::sort“ „std::swap“ für kleine Datensätze?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn