ich möchte nun die Variabel x überprüfen of sie a,e,i,o oder u beträgt,
und den entsprechenden in der 2. Spalte im array Wert zuweisen.
momentan habe ich es so gelöst:
1
for(inti=0;i<5;i++)
2
{
3
if(x==compare[i][0])
4
{
5
x=compare[i][1];
6
}
7
}
geht dies auch einfacher zu lösen ohne jedesmal mit einer for Schleife
das ganze array zu durchforsten?
sie enthält eine Menge an Schlüssel-Wert-Zuweisungen. Man kann prüfen ob
ein Wert enthalten ist und den abgebildeten Wert abfragen. Das
Abfragen/Prüfen hat eine logarithmische Laufzeit, und ist damit
schneller als die lineare Suche im Ausgangspost. Bei nur 5 Einträgen ist
aber vermutlich der Overhead noch zu groß als dass das sinnvoll wäre.
Es gibt auch noch std::unordered_map mit durchschnittlich konstanter
Laufzeit.
https://en.cppreference.com/w/cpp/container/maphttps://en.cppreference.com/w/cpp/container/unordered_map
Peter schrieb:> geht dies auch einfacher zu lösen ohne jedesmal mit einer for Schleife> das ganze array zu durchforsten?
du kannst bei einem Match (die Bedingung vom if ist wahr) die Schleife
abbrechen.
Niklas G. schrieb:> Die Klasse std::map ist genau dafür gemacht:#include <map>> #include <iostream>>> int main () {> std::map<char, char> compare { {'a', '1'},> {'e', '2'},> {'i', '3'},> {'o', '4'},> {'u', '5'}};>> int x = 'e';> auto iter = compare.find (x);> if (iter != compare.end ()) {> x = iter->second;> }>> std::cout << static_cast<char>(x) << std::endl;> }
Bekommt man sowas auch auf einem uC zum laufen oder ist die Lib nur für
x86?
KeinMathematiker schrieb:> Bekommt man sowas auch auf einem uC zum laufen oder ist die Lib nur für> x86?
Die C++ Standard Library ist an sich portabel, aber z.B. der AVR-G++
liefert sie nicht mit. Die dynamischen Standard-Container wie std::map
sind vom Speicherverbrauch her aber nicht so für Mikrocontroller
geeignet. Es war aber auch gar nicht nach uC gefragt, und das hier ist
das PC-Programmieren-Forum...
Wenn es aber wirklich nur 5 Bytes sind ist die lineare Suche, oder
einfach 5 Vergleiche, oder ein switch-case vermutlich schneller. Dank
Cache ist der Arrayzugriff viel schneller als eine Baumstruktur in
std::map.
Vielleicht lässt sich auch eine lustige bitweise Berechnung machen, die
die 5 Vergleiche auf einmal macht. Die 5 Werte zu einem 64bit-Integer
zusammenbauen, das x 5x hintereinander in einen Integer packen, XOR auf
beide Werte, und dann das 0-Byte finden.
Peter schrieb:> Hi>> Ich habe folgendes Array definiert:>
1
>charcompare[5][2]={
2
>{'a','1'},
3
>{'e','2'},
4
>{'i','3'},
5
>{'o','4'},
6
>{'u','5'}
7
>}
8
>
>> ich möchte nun die Variabel x überprüfen of sie a,e,i,o oder u beträgt,> und den entsprechenden in der 2. Spalte im array Wert zuweisen.>> momentan habe ich es so gelöst:>
1
>for(inti=0;i<5;i++)
2
>{
3
>if(x==compare[i][0])
4
>{
5
>x=compare[i][1];
6
>}
7
>}
8
>
>>> geht dies auch einfacher zu lösen ohne jedesmal mit einer for Schleife> das ganze array zu durchforsten?
Das iterative Suchen kannst Du mit einer vollständigen LUT vermeiden
(s.a. Variante1).
Statt einer Iteration über eine Teilbereichs-LUT kann Du auch eine Folge
von Alternativen (if-statements) verwenden. Mit etwas TMP ist diese
Folge von if-statements auch automatisch abhängig von der Größe Deine
LUT (s.a. Variante 2).