Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » if und char*

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
06.07.2003, 06:31 Uhr
virtual
Sexiest Bit alive
(Operator)


Sowohl die erste als auch die zweite version sind ziemlich ineffektiv, wegen des strlen in der Bedingung vom for. Von daher ist das O(n) äußerst beschönigend. Außerdem möchte ich mal bezweifeln, daß die Abfrage, ob die Strings gleich lang sind, am Anfang nicht eher Laufzeit kostet als bringt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
06.07.2003, 13:44 Uhr
~0xdeadbeef
Gast


Die Funktionen laufen beide in O(n^2). strlen muss jedesmal neu ausgewertet werden, und es läuft den String jedesmal bis zum Ende durch. Wenn man auf Handoptimierung per Assembler verzichtet, ist die schnellste Möglichkeit, die mir einfällt:

C++:
int mystrcmp(char *s, char *t) {
    int i;
    for(i = 0; s[i]; ++i) {
        if(s[i] == t[i]) continue;
        if(s[i] < t[i]) return -1;
        return 1;
    }
}


basierend darauf, dass Strings in C null-terminiert sind.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
06.07.2003, 13:51 Uhr
Pablo
Supertux
(Operator)


Ich bin natürlich davon ausgegangen, dass die Kosten für strlen in O(1) sind, sonst hast du schon recht, O(n^2)

Vielleicht wäre es auch besser, wenn ich in eine andere Variable vor die for Schleife den Wert von strlen speichere.

@0xdeadbeef: was passiert, wenn t viel kürzer als s ist? Ich meine, nehmen wir an, dass s Länge 10 hat und t Länge 5.
Wenn i == 5, dann gäbe es nicht Probleme bei t[ i ] ? Oder, was macht s [i ] < t [ i ] genau?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
06.07.2003, 13:54 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
int virtual_strcmp(const char* s, const char* t)
{
     while (*s && *s==*t)  s++, t++;
     return int(*s) - int(*t);
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 06.07.2003 um 13:54 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
06.07.2003, 14:55 Uhr
~0xdeadbeef
Gast


Wenn s länger als t ist, ist irgendwann t[i] == 0 und s[i] != 0. Das haut schon hin.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
06.07.2003, 18:54 Uhr
Oliver
S2-Pixelgeneral


Warum nehmt ihr eigentlich alle als Returnwert int???

Noch nie was von bool gehört???
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
06.07.2003, 19:03 Uhr
Pablo
Supertux
(Operator)


weil bool gleich wie int ist
int i = 0 ist äquivalent zu bool i = false;

Außerdem kennt C bool nicht. Alle "bool" Funktionen unter C macht man mit ints, es ist für mich bequem und gleich, ich verstehe aber nicht, wozu bool.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.07.2003 um 19:04 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
06.07.2003, 19:07 Uhr
~0xdeadbeef
Gast


In C? Nein. Abgesehen davon soll strcmp nicht nur rausfinden, ob die übergebenen Parameter gleich sind, sondern einen lexikografischen Vergleich durchführen. Dementsprechend braucht man mindestens drei Werte - größer, kleiner, gleich - die ein bool nicht liefern könnte, selbst wenn C diesen Datentyp kennen würde.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
06.07.2003, 19:10 Uhr
Oliver
S2-Pixelgeneral


Sind bools sind doch nur ein byte und nicht gleich 4 byte groß. (oder)


C++:

bool RIESENBOOL[1000]; // 1000 Byte groß
int RIESENINT[1000];     // 4000 Byte groß




Kann auch sein, dass ich mich täusche, aber in meinem Buch steht, dass bool nur ein Byte groß ist.

Und auch das beweist das:


C++:
#include <iostream>
using namespace std;
int main()
{
    cout << "Groesse von bool: " << sizeof(bool) << "Byte\n";
    cout << "Groesse von int: " << sizeof(int) << "Byte";

    cin.get();
    return 0;
}



@Beef:

Aber ich meine eine Funktion, die nur ausgibts ob die Strings gleich (1) oder nicht gleich (0) sind.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 06.07.2003 um 19:12 Uhr von Oliver Müller editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
06.07.2003, 19:11 Uhr
~0xdeadbeef
Gast


@virtual: Stimmt, so macht das mehr Sinn. Allerdings kann man das optimieren:

C++:
int opt_strcmp(const char *s, const char *t) {
    while(*s == *t && *s){++s;++t;}
    return (int)*s - (int)*t;
}


&& wird faul ausgewertet, deswegen ist das so schneller.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: