2011-02-25 5 views
0

En Javajava de transfert à C++

public int compareTo2(String that) { 
    String sig1 = this.sort(); 
    String sig2 = that.sort(); 
    return sig1.compareTo(sig2); 
} 

en C++

int compareTo2 (string that) { 
    string sig1 = this.sort(); 
    string sig2 = that.sort(); 
    return strcmp(sig1,sig2); 
} 

Le premier est un programme Java. Je l'ai traduit en programme C++. Est-ce que je l'ai écrit correctement? Je vous remercie.

+9

La meilleure façon de savoir: « Est-ce que je vous écris correctement » de type, essayez de le compiler, essayer de l'exécuter ;-) – ChrisJ

+1

- "Non." - C'était facile. Et après? – sellibitze

+0

@sellibitze, c'était condescendant .... et ne pas aider –

Répondre

0

En supposant que vous parlez avec string de std::string:

std::string ne fournit pas un membre nommé sort. Vous ferez cela avec std::sort:

std::sort(sig2.begin(), sig2.end()); 

Et strcmp est pensé pour être utilisé avec const char* s, donc vous devez écrire:

return strcmp(sig1.c_str(), sig2.c_str()); 

Enfin, this doit être déréférencé:

std::string sig1 = this->sort(); 
1
  • this est un pointeur, donc il doit être déréférencé avec this->item_I_want.
  • this est généralement facultatif dans une classe C++ de toute façon; le compilateur sait ce que vous voulez dire par item_I_want quand vous utilisez une méthode.
  • Il n'existe pas de méthode sort() pour C++ strings.
  • strcmp() nécessite des chaînes C (char*); vous pouvez l'appeler avec strcmp(sig1.c_str(),sig2.c_str()).
  • Une meilleure approche pour la comparaison de chaînes en C++ est simplement sig1 == sig2, ce qui renvoie un booléen.
+0

concernant le 5ème point: peut-être voulait-il que le comportement strcmp, que l'indice de première discordance soit retourné? –

+0

@Polybos Je n'étais pas vraiment sûr de ce que ses intentions étaient. – chrisaycock

1

Je suppose que vous voulez déterminer si deux chaînes dont les caractères individuels sont triés par ordre alphabétique sont égales.

Aucune de vos fonctions ne fonctionnera car vous faites des choses bizarres.

  1. java.lang.String n'a pas sort(). Vous devez transformer la chaîne en char[], puis trier ce tableau et le retourner dans un String.
  2. std::string en C++ n'a pas sort(). Vous devez utiliser std::sort()
  3. std::string en C++ peut être comparé à ==
  4. Vous appelez this.sort() en Java ... ce qui est this?
1

strcmp() ne prend pas de chaîne; vous devez utiliser

strcmp(sig1.c_str(), sig2.c_str()); 

Pour trier vos chaînes vous devez #include <algorithm> alors vous pouvez appeler

std::sort(sig1.begin(), sig1.end()); 

pour trier vos chaînes.

Je vous recommande également d'utiliser la méthode strncmp() et de donner une longueur maximale. C'est beaucoup plus sûr que strcmp().

2

Non - au moins probablement pas. Tout d'abord, std::string n'a pas sort en tant que fonction membre, donc vous utiliserez probablement std::sort à la place. Deuxièmement, vous ne pouvez pas passer un std::string à strcmp. Vous pouvez utiliser la fonction membre c_str ou simplement comparer les chaînes directement à l'aide d'opérateurs normaux (bien que cela ne donne qu'une comparaison bidirectionnelle, pas le résultat à trois voies de strcmp). Troisièmement, votre code semble dépendre de l'héritage (ou de l'extension) de la classe de chaînes standard, ce qui est rarement une bonne idée.

bool compareTo2(std::string a, std::string b) { 
    std::sort(a.begin(), a.end()); 
    std::sort(b.begin(), b.end()); 
    return a < b; 
} 

Édition: Notez que cela prend l'étape légèrement inhabituelle de passer les chaînes par valeur. Nous avons besoin d'une copie de la chaîne d'origine pour que nous puissions la trier sans modifier l'original de toute façon, donc je viens de passer en valeur pour obtenir une copie, puis j'ai trié la copie reçue en paramètre.

1

Pour quelque chose de vaguement semblable à ce qui a été donné:

#include <string> 
using std::string; 

int compareTo2(string s1, string s2) { 
    string s3, s4; 
    std::copy(s1.begin(), s1.end(), std::back_inserter<std::string>(s3)); 
    std::copy(s2.begin(), s2.end(), std::back_inserter<std::string>(s4)); 
    std::sort(s3.begin(), s3.end()); 
    std::sort(s4.begin(), s4.end()); 
    return s3.compare(s4); 
} 

int main() { 
    compareTo2(std::string("abc"), std::string("cba")); 
    return 0; 
} 
0

Si vous voulez être aussi fidèle à la sémantique Java que possible, peut-être votre devrait mettre en œuvre votre méthode comme:

int compareTo2 (const string& that) const 
{ 
    string sig1 = this.sort(); 
    string sig2 = that.sort(); 
    return strcmp(sig1.c_str(), sig2.c_str()); 
} 

Quoi qu'il en soit , lors de l'utilisation des algorithmes STL, vous devrez implémenter la sémantique "est-moins-que" sur vos algorithmes de tri:

bool operator()(const string& s1, const string& s2) const 
{ 
    return s1 < s2; 
} 
0

comme d'autres l'ont dit, strcmp n'est pas ce que vous voulez.

string a déjà une méthode qui fait que:

sig1.compare(sig2)