Fehler in diesem Programm finden.
-
SeppJ schrieb:
@Hacker: Was hast du eigentlich immer mit deiner std::list? Die ist hier (wie fast immer) total unangebracht. std::list + std::sort + std::unique = std::set, bloß 999999999999999 Mal ineffizienter.
Oder mein obiger Post. Und was heißt bitte "Was hast du eigentlich immer..."?
-
Hacker schrieb:
Oder mein obiger Post. Und was heißt bitte "Was hast du eigentlich immer..."?
Vielleicht verwechsele ich dich gerade mit jemandem, aber irgendwie habe ich das Gefühl, dass du in letzter Zeit dauernd total umständliche Sachen vorschlägst und sehr oft eine list darin vorkommt.
-
SeppJ schrieb:
P.S.: Gah! Welcher Compiler kann denn den Code compilieren? Der verletzt ja so ziemlich alle Regeln. Hast du da irgendetwas von 1993 ausgegraben?
VS2010. Also bis auf die Tatsache dass i nur in der ersten Schleife definiert ist.
Zu deinem Programm:
for (i=0;i<6;i++) { for (int j=0;j<6;j++) { if (B[i]==A[j]) // SpeicherzugriffsfehlerB[i]=C[t]; // Andersrumin C werden nie Werte geschrieben.
Ich hätte das (bei dem Ansatz) so gelöst: (Wobei die Ausgabe recht umständlich ist)
# include <iostream> #include <vector> #include <string> using namespace std; void main () { string A,B; vector<char> C; bool exists=false; cin>>A; cin>>B; for (unsigned int i=0;i<A.size();i++) { C.push_back(A[i]); } for (int i=0;i<B.size();i++) { for (int j=0;j<A.size();j++) { if (B[i]==A[j]) exists=true; } if (!exists) C.push_back(B[i]); else exists=false; } char*text=new char[C.size()+1]; text[C.size()]='\0'; memcpy( text, &C[0], C.size() ); cout <<text; delete text; }
-
SeppJ schrieb:
Hacker schrieb:
Oder mein obiger Post. Und was heißt bitte "Was hast du eigentlich immer..."?
Vielleicht verwechsele ich dich gerade mit jemandem, aber irgendwie habe ich das Gefühl, dass du in letzter Zeit dauernd total umständliche Sachen vorschlägst und sehr oft eine list darin vorkommt.
HÄ!? Meinst du PI? Der liebt nähmlich die
std::list(er hat mir gesagt,std::listist sehr sexy).Aber schau mal hier, mein Vorschlag ist Drei mal Schneller als deiner:
Mein Vorschlag:
#include <iostream> #include <string> #include <algorithm> int main() { char const firstStr [] = {"ABCDEF"}, secondStr[] = {"CDEFGHI"}; std::string output = firstStr; output += secondStr; std::sort(output.begin(), output.end()); output.assign(output.begin(), std::unique(output.begin(), output.end())); }
-
Hacker schrieb:
HÄ!? Meinst du PI? Der liebt nähmlich die
std::list(er hat mir gesagt,std::listist sehr sexy).Ist sie auch. Aber nur aus Sicht eines STL-Implementers (gibts dafür ein ordentliches, deutsches Wort?). std::vector ist langweilig, std::deque viel zu viel Frickelei. Und trotzdem schlag ich im Normalfall keine std::list vor.
Hacker schrieb:
Aber schau mal hier, mein Vorschlag ist Drei mal Schneller als deiner:
Mein Vorschlag:
...Warum erzeugst du überhaupt std::strings? kannst du das nicht ohne?

(Übrigens: Das schreit geradezu nach einem Template-Metaprogramm.)
-
Edit: Ich versuche jetzt auch, etwas mit Template zu machen
(auch wenn ich keinen Plan hab)
-
Nun, eine mögliche Lösung könnte so aussehen:
#include <iostream> namespace tmp { template <char...> struct string { static char const c_str[]; }; template <char... S> char const string<S...>::c_str[] = { S..., 0 }; template <typename T> struct valdef { typedef T value; }; template <typename, typename> struct concat; template <char... S1, char... S2> struct concat<string<S1...>, string<S2...>> : valdef<string<S1..., S2...>> {}; template <char, typename> struct push_front; template <char C, char... S> struct push_front<C, string<S...>> : valdef<string<C, S...>> {}; template <char, typename> struct remove; template <char C> struct remove<C, string<>> : valdef<string<>> {}; template <char C, char Head, char... Tail> struct remove<C, string<Head, Tail...>> : valdef < typename push_front < Head, typename remove<C, string<Tail...>>::value >::value > {}; template <char C, char... Tail> struct remove<C, string<C, Tail...>> : valdef<typename remove<C, string<Tail...>>::value> {}; template <typename> struct unique; template <> struct unique<string<>> : valdef<string<>> {}; template <char Head, char... Tail> struct unique<string<Head, Tail...>> : valdef < typename push_front < Head, typename unique < typename remove<Head, string<Tail...>>::value >::value >::value > {}; } int main() { typedef tmp::string<'A', 'B', 'C', 'D', 'E', 'F'> first; typedef tmp::string<'D', 'E', 'F', 'G', 'H', 'I'> second; std::cout << tmp::unique<tmp::concat<first, second>::value>::value::c_str; }Die Ausgabe ist wie vom TE erwartet. http://ideone.com/7ka9p
Zu beachten gilt, dass ich hier das Ergebnis nicht sortiere, da dies nicht explizit verlangt war. Es war nur verlangt, Duplikate zu entfernen.
Des Weiteren ist der ganze Template-Schrott hier in einem Namespace tmp, damit es bei Ideone kompiliert. Ansonsten kollidiert remove mit einer globalen Funktion remove, von der ich keine Ahnung habe, woher sie kommt.
-
314159265358979 schrieb:
Des Weiteren ist der ganze Template-Schrott hier in einem Namespace tmp, damit es bei Ideone kompiliert. Ansonsten kollidiert remove mit einer globalen Funktion remove, von der ich keine Ahnung habe, woher sie kommt.
Jup, irgendwie ist Ideones GCC komisch.. für Trigraph-Sequenzen muss man sogar ein Flag angeben (was ich natürlich nicht kann).
Werd mich jetzt mal hinsetzen und deinen Code analysieren
-
Hacker schrieb:
Jup, irgendwie ist Ideones GCC komisch.. für Trigraph-Sequenzen muss man sogar ein Flag angeben (was ich natürlich nicht kann).
Das ist beim GCC ganz normal.
-
SeppJ schrieb:
Hacker schrieb:
Jup, irgendwie ist Ideones GCC komisch.. für Trigraph-Sequenzen muss man sogar ein Flag angeben (was ich natürlich nicht kann).
Das ist beim GCC ganz normal.
Bei meinem muss man das aber nicht...
