-1
votes

Comment mieux comparer deux tableaux en C ++ avec des tests unitaires pour vérifier qu'ils correspondent?

Actuellement, j'ai un programme qui lit et extrait de multiples pièces de données d'un fichier, et je voudrais assurer que ces valeurs correspondent correctement aux valeurs attendues, je suis au courant de la manière dont cela devrait fonctionner dans d'autres langages de programmation. Tels que Python avec des listes et des tuples, etc. Cependant, je ne suis pas sûr de la meilleure approche pour utiliser des tests unitaires au sein de C ++ tout en maintenant le code aussi minimal et efficace que possible. J'ai actuellement plusieurs tableaux que je souhaite que je souhaite vérifier qu'ils répondent à leurs valeurs attendues afin que je puisse tester le programme avec des fichiers d'entrée différents.

Pour décrire cela, en substance, je souhaite vérifier le contenu de par exemple. xxx

est égal à {11, 12, 13, 14, 15}

et pour compléter le test de l'unité avec succès si les valeurs sont égales et échouer s'ils ne sont pas égaux ou non dans le même ordre. Ainsi, je cherche la meilleure méthode à aborder cela.


7 commentaires

Utilisez-vous un cadre de test unitaire? (Googletest, igloo, cppunit)? Ou vous voulez juste une réponse standard C ++?


Vous n'avez pas besoin de tester le code tel que int arrayone [5] = {11, 12, 13, 14, 15}; , plus que vous devez tester int x = 0; .


Utilisez std :: Array et opérateur ==


On dirait qu'un emploi pour std :: égal . Ou vous pouvez utiliser un std :: Array plutôt.


Je vise à essayer de le faire en utilisant c ++ sans utiliser d'autres cadres si possible.


@ ashwood23 essayez-vous d'éviter le stl? Insistez-vous sur l'utilisation des primitives? Si oui, sont-ils garantis comme étant la même taille?


La meilleure approche consiste à utiliser le conteneur approprié (par exemple vectoriel ou tableau) et à utiliser son opérateur == () à comparaison.


3 Réponses :


6
votes

Utilisez un C ++ std :: Array à la place et vous obtiendrez la prestation de toutes les méthodes qu'il expose, comme opérateur == : xxx

ou pour C ++ 11 et C ++ 14: xxx


2 commentaires

Il devrait être std :: Array


@Omid pas nécessaire dans C ++ 17 et OP n'a pas spécifié la version. Mais je l'ai ajouté pour le rendre clair.



5
votes

std :: Mismatch () Code> obtiendra le travail effectué et fournit plus d'informations que std :: égal code>. Cela fonctionnera avec les compilateurs pré-c ++ 11 si vous modifiez auto code> sur std :: paire code> xxx pré> meilleure version, à condition que arrayone code> est un type de tableau (il pourrait Decay à Un pointeur si vous le transmettez comme un argument de fonction). Il nécessite C ++ 11 en raison de l'utilisation de auto code> et std :: COMMENDRE (COMMENDRE (COMMENCE> P>

#include <algorithm>
#include <iterator>

int expectedResult[5] = {11, 12, 13, 14, 15};

auto res = std::mismatch(std::begin(arrayone), std:end(arrayone), std::begin(expectedResult));
if(res.first != std::end(arrayone)) {
    std::cout << "Arrays not matching at " << std::distance(arrayone, res.first) << ", expected: " << *res.second << ", got: " << *res.first;
}


2 commentaires

Pourriez-vous être amélioré avec STD :: Begin (Arrayone), STD :: Fin (Arrayone)? Il suffit de tirer de la mémoire. Ou utilisez Taillef pour calculer le nombre d'éléments.


J'aime cette réponse car il utilise des fonctionnalités modernes, mais reste compatible avec l'ancien code. (Bien que OP ait dit «la meilleure approche» afin que les réponses toutes modernes soient justes, aussi)



1
votes

Si vous insistez sur le fait que vous ne devez pas utiliser la STL et utiliser des primitives, cette question est une question C, car elle n'utilise pas les fonctionnalités C ++. Si vous pouvez supposer en toute sécurité qu'ils étaient de taille n , les suivants doivent être ok.

donné deux tableaux d'entiers primitifs de taille n, la mise en œuvre générale serait xxx

en général, STD :: Array serait une meilleure idée que l'ancienne c- Les matrices de style, mais ma compréhension de la question n'est pas claire, si vous pouvez utiliser la STL, les autres solutions sont supérieures.

Edit: Au cas où il est difficile de savoir ce que certains problèmes avec la solution ci-dessus sont les suivants:


2 commentaires

MEMCMP serait similaire


@Kennyostrom tu as raison. En fait, MemCMP est en fait meilleur pour une variété de raisons. Ma solution particulière n'est pas une bonne réponse, mais je pensais que ce serait un exemple très simple et facile sur la comparaison des tableaux. Si l'affiche originale souhaite une implémentation MEMCMP, je l'ai ajoutée ci-dessus =)