Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
4
Cevap
666
Tıklama
0
Öne Çıkarma
C++ string dizisini unique hale getirmek ?
L
11 yıl
Yüzbaşı
Konu Sahibi

 
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ı >

G
11 yıl
Yarbay

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);


Bu mesaja 1 cevap geldi.
L
11 yıl
Yüzbaşı
Konu Sahibi

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ı >
Bu mesaja 1 cevap geldi.
G
11 yıl
Yarbay

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 >
Bu mesaja 1 cevap geldi.
L
11 yıl
Yüzbaşı
Konu Sahibi

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ı >


Bu mesajda bahsedilenler: @elektro_gadget
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.