Pencarian efektif dalam vektor string yang diurutkan

Saya memiliki vektor string yang panjang. Contoh:

std::string data;
data.push_back("abc");
data.push_back("bcd");
//...
data.push_back("zze");
data.push_back("zzz");

String dalam vektor diurutkan berdasarkan abjad.

Saya mengerti saya dapat menggunakan std::find untuk menemukan keberadaan dan posisi string di std::vector. Tetapi karena vektor saya diurutkan berdasarkan abjad, apakah ada metode yang mudah diterapkan dan lebih efektif untuk memeriksa keberadaan nilai dalam vektor?


person remi    schedule 21.01.2018    source sumber
comment
Jika Anda ingin melihat apakah nilainya ada, saya sarankan menggunakan std::binary_search (tetapi ia mengembalikan boolean, bukan iterator, ke elemen yang ditemukan).   -  person orhtej2    schedule 21.01.2018
comment
... Tapi sepupu std::binary_search, std::lower_bound, dapat membantu menemukan iterator ke elemen yang Anda cari   -  person StoryTeller - Unslander Monica    schedule 21.01.2018


Jawaban (1)


Jika penampung diurutkan, Anda dapat menggunakan std::binary_search:

Memeriksa apakah elemen yang setara dengan nilai muncul dalam rentang [pertama, terakhir).

std::string some_value = "xyz";

const auto found =
    std::binary_search(std::cbegin(data), std::cend(data), some_value);

Jadi found adalah true jika some_value ditemukan dan false dalam kasus lain.


Jika Anda tertarik untuk mendapatkan iterator yang menunjuk ke elemen yang Anda cari, pertimbangkan untuk menggunakan std::batas_bawah:

const auto it =
    std::binary_search(std::cbegin(data), std::cend(data), some_value);

if (it != std::cend(data)) {
    // element is found, it points to this element
}
person Edgar Rokjān    schedule 21.01.2018
comment
Melihat kriteria vektor yang diurutkan dalam deskripsi std::binary_search, sepertinya ini hanya berfungsi untuk vektor angka. Bagaimana biner_search memahami pengurutan berdasarkan abjad? - person remi; 21.01.2018
comment
@remi000 -- std::string memiliki operator < yang kelebihan beban. std::binary_search memahami tipe apa pun, selama tipe tersebut memiliki pembanding yang kurang dari yang mengikuti pengurutan ketat-lemah. - person PaulMcKenzie; 21.01.2018
comment
@ remi000 ini hanya berfungsi untuk vektor angka - tidak sama sekali, ini dapat berfungsi untuk jenis apa pun yang sebanding melalui <. Perhatikan juga, bahwa Anda mungkin memberikan predikat khusus. - person Edgar Rokjān; 21.01.2018
comment
@PaulMcKenzie, baru sadar Anda mungkin ingin memperbarui contoh terakhir Anda? Anda mengatakan gunakan lower_bound tetapi ini menunjukkan biner_search dalam contoh. - person remi; 21.01.2018
comment
Mungkin dimaksudkan untuk @EdgarRokyan. Namun, hal yang sama juga berlaku untuk lower_bound -- jika tipenya sebanding dengan menggunakan <, maka itu akan berhasil. - person PaulMcKenzie; 21.01.2018