Einzelne Zeichen in Array gespeichert...
-
Guten Morgen,
zu meinem Problem; Ich habe ein char-Array gegeben mit einzelnen Zeichen. zb. arr[10] = {'a' , 'b', 'c', 'a', 'e' } nun muss ich zählen wieviele Zeichen darin enthalten sind und viele davon "verschieden" . siehe Beispiel 5 Zeichen und 4 verschieden. ich kriege das mit der Anzahl an verschiedenen Zeichen einfach nicht hin.

Mfg
C++Goku
-
Na ja, du musst dir halt merken welche Zeichen schon vorgekommen sind. Entweder du schreibst alle neuen Zeichen in ein neues Array (das genau so groß ist wie Array 1), guckst dann immer ob das Zeichen schon "bekannt" ist und prüfst dann wie viele Zeichen in dem neuen Array stehen, oder du nutzt gleich eine std::map.
-
Wenn es um
chargeht, kann man auch gut einfach einarraybenutzen.template<typename Iter> std::array<size_t, 256> ZaehlerTabelle(Iter first, Iter last) { std::array<size_t, 256> zaehler = {{0}}; for(Iter it = first;it != last; ++it) { ++zaehler[*it]; } return zaehler; } template<typename Iter> size_t VerschiedeneZeichen(Iter first, Iter last) { auto tabelle = ZaehlerTabelle(first, last); size_t nichtVorkommend = std::count(tabelle.begin(), tabelle.end(), 0); size_t vorkommend = tabelle.size() - nichtVorkommend; return vorkommend; } int main() { std::array<char, 4> zeichen = {{'a', 'b', 'c', 'a'}}; auto anzahl = VerschiedeneZeichen(zeichen.begin(), zeichen.end()); std::cout << anzahl; }Wenn es um einen größeren Typen geht, sollte man stattdessen wie schon gesgat wurde eine
mapoderunordered_mapbenutzen. Alternativ kann man das Array auch sortieren und dann bei einem einmaligen Durchlauf mitzählen:template<typename Iter> size_t VerschiedeneZeichenInSortiert(Iter first, Iter last) { typedef typename std::iterator_traits<Iter>::value_type CharType; size_t anzahl = 1; CharType voriger = *first; for(Iter it = first; it != last; ++it) { if (*it != voriger) ++anzahl; voriger = *it; } return anzahl; } template<typename Iter> size_t VerschiedeneZeichen(Iter first, Iter last) { typedef typename std::iterator_traits<Iter>::value_type CharType; std::vector<CharType> sortiert(first, last); std::sort(sortiert.begin(), sortiert.end()); return VerschiedeneZeichenInSortiert(sortiert.begin(), sortiert.end()); } int main() { std::array<char, 4> zeichen = {{'a', 'b', 'c', 'a'}}; auto anzahl = VerschiedeneZeichen(zeichen.begin(), zeichen.end()); std::cout << anzahl; }
-
const char* psz = "banane"; const int anzahl = strlen(psz); set<char> foo (psz,psz+anzahl); const int verschieden = foo.size(); foo.clear();oder so ähnlich.