53 votes

Existe-t-il un moyen de raccourcir cette condition ?

while (temp->left->oper == '+' || 
       temp->left->oper == '-' || 
       temp->left->oper == '*' || 
       temp->left->oper == '/' || 
       temp->right->oper == '+' || 
       temp->right->oper == '-' || 
       temp->right->oper == '*' || 
       temp->right->oper == '/')
{
    // do something
}

Pour plus de clarté : temp est un pointeur qui pointe vers le suivant node structure :

struct node
{
    int num;
    char oper;
    node* left;
    node* right;
};

1 votes

Sans connaître les dépendances entre temp->left y temp->right vous ne pouvez pas optimiser dans tous les opérateurs égaux. Optiquement, vous pourriez utiliser des expressions régulières, mais en interne, c'est probablement à peu près la même chose, voire moins efficace.

3 votes

Je serais intéressé de savoir pourquoi vous pensez avoir ce problème. Cela ressemble à l'interprétation d'un arbre d'expression au moment de l'exécution, et si c'est le cas, il existe de bien meilleures façons de le faire.

1voto

Lambda & std::string_view

string_view offre de nombreuses fonctionnalités de std::string et peut opérer sur des littéraux et il ne possède pas l'attribut string .

Utilisez Lambda au lieu de fonction pour un code très local qui n'est pas utile pour le reste du fichier. De même, il n'est pas nécessaire de passer des variables lorsque lambda peut les capturer. Obtenez également inline sans le spécifier pour une fonction que vous auriez autrement créée.

Faire char const :


Vous pouvez modifier const char c à const node *t accéder à son oper à l'intérieur de la lambda. Mais ce n'est pas une bonne idée car les membres de left / right de temp peut être modifié.

auto is_arithm2 = [](const node *t) {
  return std::string_view("+-/*").find_first_of(t->oper) != std::string::npos;
};

while(is_arithm2(temp->left) || is_arithm2(temp->right)){
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X