Bagaimana Anda Menemukan Sesuatu dalam Vektor di C++?

Vektor C++ tidak memiliki fungsi find member. Namun, pustaka algoritme memiliki fungsi find() dari berbagai jenis yang dapat digunakan untuk menemukan sesuatu dalam vektor C++. Pustaka algoritme memiliki empat grup fungsi find() yang dapat diklasifikasikan sebagai Find, Find End, Find First, dan Adjacent Find.

Untuk menggunakan pustaka vektor dan algoritme, program C++ harus dimulai dengan:

#include <algorithm>

#include <vector>

#include <iostream>

using namespace std;

Tutorial ini memberikan dasar-dasar menemukan nilai dalam vektor C++. Semua kode dalam tutorial ini ada di fungsi main(), kecuali dinyatakan lain. Jika vektor terdiri dari string, maka gunakan kelas string; dan jangan gunakan “const char* ”. Dalam hal ini, kelas string harus disertakan juga, seperti:

#include <string>

Isi Artikel

Menemukan

InputIterator find(InputIterator dulu, InputIterator terakhir, const T& nilai);

Kode berikut menggunakan fungsi ini untuk mengetahui apakah bunga, “Bunga jagung” termasuk di antara daftar vektor bunga:

#include <algorithm>

#include <vector>

#include <string>

#include <iostream>

using namespace std;

 

    int main()
    {
        vectorvtr = {"Dog Rose", "Honeysuckle", "Enchanter's nightshade", "Columbine", "Kingcup", "Cornflower", "Water avens", "Forget-me-not"};

        vector::iterator it = find(vtr.begin(), vtr.end(), "Cornflower");

        if (it == vtr.end())
cout<< "Flower was not found!" <<endl;
        else
cout<< "Flower found at index: " << it - vtr.begin() <<endl;

        return 0;
    }

Outputnya adalah:

Flower found at index: 5

Seluruh daftar vektor telah menjadi target temuan. Dari sintaks fungsi find(), “pertama” adalah vtr.begin() dalam kode, dan “terakhir” adalah vtr.end() dalam kode. Nilai yang akan dicari dari sintaks fungsi find() yang dilambangkan dengan const-T&-value, adalah “Bunga jagung” dalam kode.

Fungsi find() memindai daftar vektor dari awal. Jika tidak melihat nilai yang dicari, itu akan mencapai akhir vektor. Akhir dari vektor secara resmi adalah vtr.end(), yang berada tepat di luar elemen terakhir. Jika tidak melihat nilai yang dicari, iterator akan kembali menunjuk ke vtr.end().

Nilai yang dicarinya mungkin berada di tempat yang berbeda dalam vektor yang sama. Ketika ia melihat nilai pertama yang dicarinya, ia berhenti di sana dan mengembalikan iterator yang menunjuk ke nilai itu.

Setiap nilai dalam sebuah vektor memiliki indeks. Nilai pertama memiliki indeks 0, sesuai dengan vtr.begin(). Nilai kedua memiliki indeks 1, sesuai dengan vtr.begin() + 1. Nilai ketiga memiliki indeks 2, sesuai dengan vtr.begin() + 2. Nilai keempat memiliki indeks 3, sesuai dengan vtr.begin() + 3 ; dan seterusnya. Jadi, indeks dari nilai pertama yang ditemukan diberikan oleh:

it - vtr.begin()

Sensitivitas Huruf Besar

Menemukan dalam vektor peka huruf besar-kecil. Jika nilai yang ditemukan adalah “CORNFLOWER” untuk program di atas, itu tidak akan ditemukan, dan vtr.end() akan dikembalikan.

Rentang Dalam Batas

Rentang tidak harus seluruh vektor. Untuk program di atas, rentangnya bisa dari indeks 1 hingga indeks 4. Yaitu, dari “vtr.begin() + 1” hingga “vtr.end() – 4”. “vtr.end() – 4” diperoleh dengan mengurangkan dari belakang, mengingat bahwa vtr.end() hanya di luar elemen terakhir.

Ketika seluruh daftar vektor adalah rentang, menguji apakah iterator yang kembali adalah vtr.end() menunjukkan apakah nilainya ditemukan atau tidak. Jika iterator yang kembali adalah vtr.end(), itu berarti nilainya tidak ditemukan. Sekarang, ketika rentang lebih kecil, jika iterator kembali adalah elemen terakhir dari rentang yang dipilih, itu berarti nilainya tidak ditemukan atau itu adalah nilai terakhir dari rentang.

Catatan : Pencarian berhenti pada elemen terakhir dari rentang yang dipilih (lebih kecil), jika nilai tidak ditemukan dalam rentang tersebut, atau jika nilai ditemukan, adalah elemen terakhir dari rentang yang dipilih. Jika nilai yang ditemukan adalah elemen terakhir, iterator yang menunjuk ke elemen tersebut akan dikembalikan. Jika nil
ai ditemukan sebelumnya, pencarian akan berhenti pada elemen tersebut sebelum elemen terakhir dari rentang yang dipilih. Iterator elemen itu sebelumnya akan dikembalikan.

Kode berikut mengilustrasikan skema ini:

    #include <algorithm>

    #include <vector>

    #include <string>

    #include <iostream>

    using namespace std;

 

    int main()
    {
        vectorvtr = {"Dog Rose", "Honeysuckle", "Enchanter's nightshade", "Columbine", "Kingcup", "Cornflower", "Water avens", "Forget-me-not"};

        vector::iterator it = find(vtr.begin() + 1, vtr.end() - 4, "Cornflower");

        if (it == vtr.end())
cout<< "Flower was not found!" <<endl;
        else if (it - vtr.begin() == 4) {    //last element in chosen range
            if (*it == string("Cornflower"))
cout<< "Flower found at index: " << it - vtr.begin() <<endl;
            else
cout<< "Flower was not found in range!" <<endl;
        }    
        else {
cout<< "Flower found at index: " << it - vtr.begin() <<endl;
        }

        return 0;
    }

Outputnya adalah:

Flower was not found in range!

Sekarang, “Bunga jagung” ada di indeks 5, dan “Kingcup” ada di indeks 4. Elemen terakhir dalam rentang kecil yang dipilih untuk pencarian adalah “Kingcup”. Jadi, kondisi pengujian yang sesuai adalah “it – vtr.begin() == 4”. Perhatikan bahwa ekspresi, “vtr.end() – 4” dan “it – vtr.begin() == 4” masing-masing memiliki 4, hanyalah kebetulan.

Untuk memiliki “Bunga jagung” dalam rentang kecil pencarian, kondisi pengujian yang sesuai harus “it – vtr.begin() == 5”. Kode berikut menggambarkan hal ini:

    #include <algorithm>

    #include <vector>

    #include <string>

    #include <iostream>

    using namespace std;

 

    int main()
    {
        vectorvtr = {"Dog Rose", "Honeysuckle", "Enchanter's nightshade", "Columbine", "Kingcup", "Cornflower", "Water avens", "Forget-me-not"};

        vector::iterator it = find(vtr.begin() + 1, vtr.end() - 3, "Cornflower");

        if (it == vtr.end())
cout<< "Flower was not found!" <<endl;
        else if (it - vtr.begin() == 5) {
            if (*it == string("Cornflower"))
cout<< "Flower found at index: " << it - vtr.begin() <<endl;
            else
cout<< "Flower was not found in range!" <<endl;
        }    
        else {
cout<< "Flower found at index: " << it - vtr.begin() <<endl;
        }

        return 0;
    }

Outputnya adalah:

Flower found at index: 5

Lebih dari Satu Kejadian

Dalam program berikut, “Bunga jagung” terjadi di lebih dari satu tempat. Untuk menemukan semua indeks kemunculan, gunakan loop while untuk melanjutkan pencarian, setelah kemunculan sebelumnya, hingga akhir (vtr.end()) dari vektor. Programnya adalah:

#include <algorithm>

    #include <vector>

    #include <string>

    #include <iostream>

    using namespace std;

 

    int main()
    {
        vectorvtr = {"Dog Rose", "Cornflower", "Enchanter's nightshade", "Columbine", "Kingcup", "Cornflower", "Water avens", "Cornflower"};

        vector::iterator it = find(vtr.begin(), vtr.end(), "Cornflower");
        while (it != vtr.end()) {
            if (*it == string("Cornflower"))
cout<< "Flower found at index: " << it - vtr.begin() <<endl;
            it++;
        }

        return 0;
    }

Outputnya adalah:

Flower found at index: 1

Flower found at index: 5

Flower found at index: 7

Menemukan Bilangan Bulat

Sebuah vektor dapat terdiri dari bilangan bulat. Nilai integer pertama dapat ditemukan menggunakan fungsi find() (dari pustaka algoritme). Program berikut menggambarkan hal ini:

#include <algorithm>

#include <vector>

#include <iostream>

using namespace std;

 

    int main()
    {
        vectorvtr = {1, 2, 3, 1, 2, 3, 1, 2, 3};

        vector::iterator it = find(vtr.begin(), vtr.end(), 3);

        if (it == vtr.end())
cout<< "Number was not found!" <<endl;
        else
cout<< "Number found at index: " << it - vtr.begin() <<endl;

        return 0;
    }

Outputnya adalah:

Number found at index: 2

for the first occurrence of the value, 3.

Predikat

InputIterator find_if(InputIterator dulu, InputIterator terakhir, Predikat sebelum);

Fungsi di sini adalah find_if() dan bukan hanya find(). Pred adalah nama fungsi yang memberikan kriteria pencarian. Argumen ketiga ini hanya mengambil nama fungsi, tanpa argumen dan tanpa tanda kurung. Jika fungsi predikat mengambil argumen, maka dalam definisi fungsi, parameter untuk argumen diberikan. Program berikut mengilustrasikan hal ini, mencari bilangan genap pertama dalam daftar vektor:

#include <algorithm>

    #include <vector>

    #include <iostream>

    using namespace std;

    bool fn(int n) {
        if ((n % 2) == 0)
            return true;
        else
            return false;
    }

    int main()
    {
        vectorvtr = {1, 3, 5, 7, 8, 9, 10, 11, 12};

        vector::iterator it = find_if(vtr.begin(), vtr.end(), fn);

        if (it == vtr.end())
cout<< "Number was not found!" <<endl;
        else
cout<< "Number found at index: " << it - vtr.begin() <<endl;

        return 0;
    }

Outputnya adalah:

Number found at index: 4

Perhatikan bahwa seluruh vektor telah dicari, dengan rentang, “vtr.begin(), vtr.end()”.

Nama fungsi predikat di sini adalah, fn. Dibutuhkan satu argumen, n sebuah int. Saat fungsi find_if() mulai memindai vektor dari elemen pertama, ia memanggil fungsi predikat dengan setiap angka dalam vektor sebagai argumen. Pemindaian berhenti ketika mencapai elemen pertama dalam vektor di mana predikat mengembalikan nilai true.

Kesimpulan

Fungsi find() di library algoritma ada dalam empat kategori, yaitu: Find, Find End, Find First, dan Adjacent Find. Hanya kategori, Temukan yang telah dijelaskan di atas, dan sebagian besar. Penjelasan yang diberikan di atas adalah dasar untuk semua fungsi find() di library algoritma. Fungsi Find() menangani iterator secara langsung dan menangani indeks secara tidak langsung. Programmer harus tahu bagaimana mengkonversi iterator ke indeks dan aritmatika iterator umum seperti yang digambarkan di atas.

Related Posts