Isih Data sambil Mengekalkan Kedudukan Asal dalam C
Dalam C , keperluan sering timbul untuk mengisih koleksi elemen sambil mengekalkan kedudukan asalnya . Ini penting apabila faktor luaran bergantung pada kedudukan ini.
Pertimbangkan set sampel A = [5, 2, 1, 4, 3]. Isih set ini menggunakan fungsi isihan standard akan menghasilkan B = [1,2,3,4,5]. Walau bagaimanapun, kami juga ingin menjejaki indeks asal unsur yang diisih, menghasilkan set C = [2, 1, 4, 3, 0], yang menunjukkan indeks setiap elemen dalam B dalam A asal.
Penyelesaian menggunakan C 11 Lambdas
C 11 lambdas menyediakan cara yang mudah untuk menyelesaikan masalah ini masalah:
#include <iostream> #include <vector> #include <numeric> #include <algorithm> using namespace std; template <typename T> vector<size_t> sort_indexes(const vector<T> &v) { // Initialize original index locations vector<size_t> idx(v.size()); iota(idx.begin(), idx.end(), 0); // Sort indexes based on comparing values in v stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; }
Dalam pelaksanaan ini, kami mula-mula mencipta idx vektor dengan indeks asal. Kami kemudian mengisih indeks menggunakan stable_sort, memastikan elemen dengan nilai yang sama mengekalkan susunan relatifnya. Idx vektor yang terhasil mengandungi indeks yang diisih.
Penggunaan
Untuk menggunakan fungsi ini, cuma masukkan vektor nilai anda dan ulangi indeks yang diisih:
for (auto i: sort_indexes(v)) { cout << v[i] << endl; }
Penyesuaian
Penyesuaian fungsi sort_indexes boleh disesuaikan untuk memenuhi keperluan khusus anda. Sebagai contoh, anda boleh menyediakan vektor indeks asal anda sendiri, membekalkan fungsi isihan tersuai atau pembanding, atau menyusun semula v semasa mengisih menggunakan vektor tambahan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Isih Data dalam C Sambil Mengekalkan Indeks Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!