Rumah  >  Artikel  >  pembangunan bahagian belakang  >  **Adakah std::sort Sentiasa Panggil Fungsi Swap Tersuai untuk Julat Kecil?**

**Adakah std::sort Sentiasa Panggil Fungsi Swap Tersuai untuk Julat Kecil?**

Susan Sarandon
Susan Sarandonasal
2024-10-26 14:19:02398semak imbas

**Does std::sort Always Call Custom Swap Functions for Small Ranges?**

std::sort Tanpa Pertukaran Tersuai untuk Julat Kecil

Apabila bekerja dengan fungsi std::sort dalam C , secara amnya dijangkakan bahawa fungsi swap tersuai yang disediakan oleh pengaturcara akan dipanggil semasa proses pengisihan. Walau bagaimanapun, dalam senario tertentu, ini mungkin tidak berlaku. Khususnya, untuk julat data yang kecil, beberapa pelaksanaan std::sort, seperti yang terdapat dalam stdlibc GCC , boleh menggunakan isihan sisipan untuk pengoptimuman prestasi.

Pengoptimuman Isih Sisipan

Isih sisipan, tidak seperti algoritma isihan pantas atau intro lalai yang digunakan oleh std::sort, tidak menggunakan swap eksplisit. Sebaliknya, ia beroperasi dengan menggerakkan blok elemen data untuk mencapai susunan yang diisih. Pendekatan ini lebih pantas daripada pertukaran individu pada julat kecil.

Dalam pelaksanaan dalaman isihan sisipan (terdapat dalam bits/stl_algo.h dalam GCC 4.7.2), pergerakan data dilakukan menggunakan GLIBCXX_MOVE dan _GLIBCXX_MOVE_BACKWARD3 fungsi. Fungsi ini sepadan dengan std::move dan std::move_backward dalam C 11. Walau bagaimanapun, ia mungkin menggunakan penyalinan dan bukannya bergerak jika makro __GXX_EXPERIMENTAL_CXX0X tidak ditakrifkan.

Kesan pada Tersuai Swap

Akibat daripada pengoptimuman yang digunakan oleh isihan sisipan, fungsi swap tersuai yang ditakrifkan oleh pengaturcara mungkin tidak dipanggil semasa pengisihan julat data yang kecil. Ini boleh menjadi kebimbangan khusus jika fungsi swap tersuai adalah mahal dari segi pengiraan.

Contoh

Pertimbangkan kod berikut di mana fungsi swap tersuai dilaksanakan dan vektor struct A diisih:

<code class="c++">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 = 4;
    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>

Untuk julat kecil seperti n=4, fungsi swap tersuai tidak dipanggil walaupun tatasusunan diisih dengan betul. Ini berlaku kerana isihan sisipan digunakan, yang tidak memerlukan pertukaran eksplisit.

Kesimpulan

Adalah penting untuk mengetahui bahawa std::sort mungkin tidak selalu menggunakan swap tersuai untuk julat data yang kecil disebabkan oleh pengoptimuman algoritma. Ini boleh mempunyai implikasi apabila bekerja dengan fungsi swap tersuai yang mahal.

Atas ialah kandungan terperinci **Adakah std::sort Sentiasa Panggil Fungsi Swap Tersuai untuk Julat Kecil?**. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn