Şimdi Ara

C++ string dizisini unique hale getirmek ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
4 Misafir - 4 Masaüstü
5 sn
5
Cevap
0
Favori
597
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  •  
    string sDizi[] = {"a", "b", "c", "a", "d", "b"};

    set<string> benzersiz( sDizi, sDizi + ( sizeof(sDizi) / sizeof(*sDizi) ) );


    şimdi bu yukardaki işlemden sonra 'benzersiz'deki elemanları tekrar 'sDizi' ye atayabilrim(kendi döngümüz haricinde)

    veya string dizisinde bu işlemi yapabilceğim daha iyi bir yöntem(fonksiyon) varmı ? İngilizcem olmadığından pek araştıramıyorum :S

    < Bu ileti mobil sürüm kullanılarak atıldı >



  • Stl ile çalışırken normal dizileri unutsan iyi olur. Yani bu yaptığın c++ ça olmamış.

    template <typename T> 
    std::vector<T> ayikla(std::vector<T> liste)
    {
    std::set<T> kume(liste.begin(), liste.end());
    return std::vector<T> (kume.begin(), kume.end());
    }


    Bu fonksiyon herhangi bir türde nesne dizisini sıralanmış ve fazlalıklar ayıklanmış olarak geri döndürür. Kullanırken de aşağıdaki gibi. Koyu olarak işaretlediğim kısım tür belirtir.

    std::vector<std::string> sDizi = {"s", "b", "c", "a", "d", "b",};
    auto yeniDizi = ayikla<std::string> (sDizi);
  • quote:

    Orijinalden alıntı: elektro_gadget

    Stl ile çalışırken normal dizileri unutsan iyi olur. Yani bu yaptığın c++ ça olmamış. (. . .)


    teşekkürler hocam. Ama daha önce vector ile yapmıştım(belirtmemişim kusra bakmayın):

    şu şekil yapmıştım:
     
    string sDizi[] = {"ali", "veli", "ibo", "ali", "maho", "ibo"};
    vector<string> veDizi(begin(sDizi), end(sDizi));

    set<string> benzersiz(veDizi.begin(), veDizi.end());

    veDizi.assign(benzersiz.begin(), benzersiz.end());

    veDizi.shrink_to_fir();


    ama o sorduğum sekilde nasıl yapılır merak ettim onuda çözdüm(copy nedense hiç aklıma gelmemişti ama eninde sonunda geldi .d):
     
    string sDizi[] = {"a", "b", "c", "a", "d", "b
    "};

    set<string> benzersiz(sDizi, sDizi + (sizeof(sDizi) / sizeof(*sDizi) ) );

    string *spDizi = new string[benzersiz.size()];

    copy(benzersiz.begin(), benzersiz.end(), spDizi);

    // . . .

    delete[] spDizi;



    hocam bir sorum daha olacaktı:

    şimdi mesela:
    int nDizi[] = {1, 2, 3, 4};

    gibi bir tanımlama yapıp indislere istediğimiz değerleri atayabiliyoruz.

    Peki dinamik bir dizide bunu nasıl yapabilriz:

    int *nPo = new int[5];

    yani yapılmak istenen süslü parantez arasında dinamik dizinin indislerine değerlerini vermek:
    bi nevi..:
    nPo = {1, 2, 3, 4, 5};



    < Bu mesaj bu kişi tarafından değiştirildi lavara123 -- 29 Kasım 2014; 20:29:14 >
    < Bu ileti mini sürüm kullanılarak atıldı >




  • Ama işte dizi bu probleme uygun bir çözüm değil. Çünkü dizinin içeriğini kodlama anında bildikten sonra zaten uğraşmanın anlamı yok. Artı olarak sizeof sadece dizinin derleme anındaki uzunluğunu alabilir. Fazla elemanları sildikten sonra sizeof ile tekrar ölçemezsin. Kısaca hiçbir mantıklı tarafı yok.

    Eğer istediğin aynı dizinin üzerine yazmaksa;
    std::vector<std::string> liste;
    // Listeyi çalışma esnasında doldur...

    std::set<std::string> kume(liste.begin(), liste.end());

    liste.resize(kume.size());
    std::copy(kume.begin(), kume.end(), liste.begin());

    Ya da daha iyisi önce kümeyi doldur sonra vektörü hazırla.

    Diğer soru için c++ ta herhangi bir yöntem yok. Ama yeni standartlarda geldiyse gözümden kaçmış olabilir.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 29 Kasım 2014; 23:20:17 >
  • teşekkürler hocam. Onları sadece merak ettiğiminden sormuştum ve o şekil örnekler vermiştim neyse.

    O şekil bir tanımlama C++11 ile gelmiş herhalde:

     
    int *cpp11_array = new int[5] {1, 2, 3, 4, 5};


    şurdahttp://en.m.wikipedia.org/wiki/New_(C%2B%2B) Syntax başlığının altında en altaki kod bloğunda bu örneği vermiş ve birşeyler demiş ama hiç bişey anlamadım sadece yukardaki tanımlamanın c++11 ile geldiğini anladım ama VS 2012'de denedim kabul etmedi .d @elektro_gadget @elektro_gadget

    < Bu ileti mini sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.