C++ :: Aufgabe #347
1 Lösung

Unikat- Liste aus zwei Zeichenketten/Sätzen
Anfänger - C++
von JKooP
- 02.04.2021 um 18:13 Uhr
Gegeben sind zwei Zeichenketten (a, b) bestehend aus Kleinbuchstaben und Leerzeichen.
Es sollen die Wörter in ein neues String- Array überführt werden,
die genau einmal in beiden Zeichenketten vorkommen (Unikate).
Beispiel 1:
a = „der pfannkuchen schmeckt süß“
b = „der pfannkuchen schmeckt salzig“
Lösung: { „süß“, „salzig“ }
Beispiel 2:
a = „apfel apfel“
b = „banane“
Lösung: { „banane“ }
Beispiel 3:
a = „der pfannkuchen schmeckt“
b = „der pfannkuchen schmeckt“
Lösung: { }
Erstelle eine Methode/Funktion, die solch ein String- Array zurückgibt.
Viel Spaß
Es sollen die Wörter in ein neues String- Array überführt werden,
die genau einmal in beiden Zeichenketten vorkommen (Unikate).
Beispiel 1:
a = „der pfannkuchen schmeckt süß“
b = „der pfannkuchen schmeckt salzig“
Lösung: { „süß“, „salzig“ }
Beispiel 2:
a = „apfel apfel“
b = „banane“
Lösung: { „banane“ }
Beispiel 3:
a = „der pfannkuchen schmeckt“
b = „der pfannkuchen schmeckt“
Lösung: { }
Erstelle eine Methode/Funktion, die solch ein String- Array zurückgibt.
Viel Spaß
Lösungen:
C++ 17
C-Code

#include <iostream> #include <vector> #include <tuple> #include <string> #include <map> using namespace std; vector<string> string_split(const string& s, const char& del = ' ') { vector<string> v; string w = ""; for (const auto& c : s) { if (c == del) { v.push_back(w); w = ""; } else { w += c; } } v.push_back(w); return v; } template<typename T> bool map_contains_key(const map<T, int>& m, const T& compare) { for (const auto& k : m) if (k.first == compare) return true; return false; } template<typename T> vector<T>vector_concat(const vector<T>& v1, const vector<T>& v2) { vector<T>c{ v1 }; c.insert(c.end(), v2.begin(), v2.end()); return c; } vector<string> unique_words(const string& a, const string& b) { map<string, int>m; vector<string>v; auto concat{ vector_concat(string_split(a), string_split(b)) }; for (const auto& i : concat) if (map_contains_key(m, i)) m[i]++; else m.emplace(i, 1); for (const auto& i : m) if (i.second == 1) v.push_back(i.first); return v; } int main() { vector<tuple<string, string>>v{ {"der pfannkuchen schmeckt suess", "der pfannkuchen schmeckt salzig"}, {"apfel apfel", "banane"} , {"der pfannkuchen schmeckt", "der pfannkuchen schmeckt"} }; for (const auto& i : v) { for (const auto& k : unique_words(get<0>(i), get<1>(i))) cout << k << ", "; cout << "\n"; } }