Çalışıyor Özel Vektör ve Yineleyici Kullanımı

L3G

I manage illuminati
Kurucu
Katılım
29 Haz 2019
Mesajlar
918
Tepkime puanı
269
Puanları
63
Konum
6,6,6
Merhabalar, sizlere c++ üzerinde vektör içerisinde özel yapı (struct) ekleyip bunu istediğimiz yerde nasıl kullanabileceğimizi anlatmaya çalışıcam.
Örnek ImGui'de "id" ve kullandığım methodun her çağrısında bir "float" oluşturup bu değerleri "ImGuiID" karşılaştırması yaparak her methodun kendi float değerini okuyup yazmaya yarıyor.

Öncelikle özel bir yapı oluşturuyorum bunun içerisinde tüm çağrılarda id farklı olacağı için bunu parmak izi gibi kullanıyorum ve bir "ImGuiID" değişkeni oluşturuyorum. Bunun yanı sıra her çağrıda bir float değer oluşturup tamamen birbirlerinden bağımsız şekilde okuyup yazmak istiyorum yani bu değer statik olmayacak.

C++:
struct my_alpha_vector {
public:
    ImGuiID id;
    float alpha_rate;
};
std::vector<my_alpha_vector > custom_a_vector;
Sonrasında method içerisinde yineleyici (iterator) ile oluşturduğumuz vektör (custom_a_vector) içerisinde kullanmak istediğimiz yapıyı (struct) bulup içerisindeki değeri değiştirmemize yarayan kodu ekliyoruz.

C++:
int local_vec_id = -1; // Methodum için döndürülecek id'yi önceden tanımlıyorum ve id ler eşleşirse bu değer değişecek
struct find_vector
{
    ImGuiID id; // Dışarıdan gelen id yi bu değere aktarıyoruz
    find_vector(ImGuiID id) : id(id) {} // Burası structumuzun constructor'u
    bool operator () (const my_alpha_vector& m) const
    {
        return m.id == id; // Kullandığım methodun id'si ile struct içerisindeki id eşleşiyorsa elementi döndür
    }
};
Burada ise studio alan adını kullanarak vektör içerisinde ekleyeceğimiz değerler var mı diye kontrol ediyoruz eğer yok ise bir başlangıç değeri oluşturup vektör içerisine ekliyoruz
C++:
std::vector<my_alpha_vector >::iterator it = std::find_if(custom_a_vector.begin(), custom_a_vector.end(), find_vector(id));
    if (std::find_if(custom_a_vector.begin(), custom_a_vector.end(), find_vector(id)) != custom_a_vector.end()) {
     // Eğer vektöre daha önce bu item eklenmiş ise yapılabilecek işlemleri burada yapabilirsiniz
    }
    else {
    // Vektöre item eklenmemişse id ve bir değer ataması yapıyoruz
        my_alpha_vector  localalpha = { id,0.f };
        custom_a_vector.push_back(localalpha);
    }
    for (unsigned i = 0; i < custom_a_vector.size(); i++) {
        if (custom_a_vector[i].id == id) {
            local_vec_id = i;
        }
    }
ve son olarak kullanımı ise aşağıdaki gibidir

C++:
custom_a_vector[local_vec_id].alpha_rate = 1.f;
 
Son düzenleme:

Bu içeriği görüntüleyen kullanıcılar (Kullanıcı: 0, Ziyaretçi: 1)

Üst