Katakanlah saya memiliki vektor bilangan bulat:
std::vector<int> indices;
for (int i=0; i<15; i++) indices.push_back(i);
Lalu saya mengurutkannya dalam urutan menurun:
sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];})
for (int i=0; i<15; i++) printf("%i\n", indices[i]);
Ini menghasilkan yang berikut:
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Sekarang saya ingin memiliki angka 3, 4, 5, dan 6 untuk dipindahkan ke akhir, dan menjaga urutan turun untuk mereka (lebih disukai tanpa harus menggunakan sort
untuk yang kedua kalinya). Yaitu, inilah yang saya inginkan:
14
13
12
11
10
9
8
7
2
1
0
6
5
4
3
Bagaimana saya harus memodifikasi fungsi perbandingan std::sort
untuk mencapai itu?
return indices[first] > indices[second]
Bukankah maksud Andareturn first < second;
?std::greater
dari<functional>
dapat digunakan sebagai pengganti lambda Anda. Mengenai pertanyaan Anda, menulis komparator yang lebih verbose yang memastikan nilai Anda membandingkan dengan cara yang Anda inginkan mungkin merupakan cara termudah untuk melakukannya.return first > second
.Jawaban:
Fungsi perbandingan Anda salah karena nilai yang Anda peroleh
first
dansecond
merupakan elemen daristd::vector
. Oleh karena itu, tidak perlu menggunakannya sebagai indeks. Jadi, Anda perlu berubahuntuk
Sekarang, mengenai masalah yang Anda coba selesaikan ...
Anda dapat meninggalkan 3, 4, 5 dan 6 dari perbandingan dengan elemen lain dan masih membandingkan satu sama lain:
Demo
sumber
Fungsi dari perpustakaan algoritma standar seperti
iota
,sort
,find
,rotate
dancopy
akan membuat hidup Anda lebih mudah. Contoh Anda sampai pada:Keluaran:
@TedLyngmo dalam komentar membuat poin yang baik bahwa itu bisa / harus ditingkatkan dengan:
sumber
auto b = a + 4;
salah (jika Anda ingin tetap konsisten dengan cuplikan sebelumnya). Seharusnyaauto b = a + 3;
karenastd::rotate
Anda gunakanb + 1
Solusi 1
Pendekatan langsung dengan pembanding non-linear .
Solusi 2
Menggunakan
std::algorithm
s (partisi)!Pertimbangan Kinerja
Ini mungkin terlihat seperti solusi kedua lebih lambat karena overhead partisi. Mungkin tidak, karena prediksi cache dan miss-branch di prosesor modern.
Tolok ukur
sumber
n <= 6 && 3 <= n
menjadi apa pun yang bekerja paling baik untuk CPU target sehingga Anda tidak mendapatkan apa-apa dengan memperkenalkan angka 2 dan 7 tetapi berpotensi kebingungan - dan mengapa mengambil pointer ke vektor alih-alih referensi?const
memberi tahu pembaca bahwa fungsinya tidak mengubah nilainya? Dalam kasus satu liner khusus ini mungkin jelas, tetapi secara umum tidak.