3 votes

Puis-je définir begin et end sur un itérateur d'entrée ?

Disons que j'ai un itérateur d'entrée de type MyInputIter (que j'utilise pour parcourir une structure arborescente) qui satisfait à la condition std::input_iterator concept.

Y-a-t-il des raisons pour lesquelles je ne devrais pas définir begin() et end() sur l'itérateur lui-même ?

struct MyInputIter
{
    // iterator stuff omitted

    auto begin() const { return *this; }
    auto end() const { return MySentinel{}; }
};

La raison étant que je n'ai pas besoin de créer un autre type juste pour envelopper begin et end pour que je puisse l'utiliser dans une boucle for :

MyInputIter iterate(TreeNode root, FilterPattern pattern)
{
    return MyInputIter{ root, pattern };
}

void foo()
{
    for (auto item : iterate(someRandomTreeNode, "*/*.bla"))
        process(item);
}

tout en étant capable de l'utiliser comme un itérateur :

std::vector<TreeNode> vec(iterate(someRandomTreeNode, "*"), MySentinel{});

5voto

user2079303 Points 4916

Y a-t-il des raisons pour lesquelles je ne devrais pas définir begin() et end() sur l'itérateur lui-même ?

Questions potentielles à prendre en compte :

  1. L'implémentation de ces fonctions pour l'itérateur peut être coûteuse. Soit à cause de la nécessité de parcourir la structure pour les trouver, soit à cause de l'état supplémentaire stocké dans l'itérateur.
  2. Elle peut prêter à confusion car elle s'écarte des schémas habituels. Edit : Comme l'a souligné il existe un précédent pour les itérateurs qui sont des gammes dans std::filesystem::directory_iterator Il se peut donc que ce ne soit pas un problème important en général. Il faut également se demander si l'implémentation de votre gamme fonctionne de la manière attendue.

La raison étant que je n'ai pas à créer un autre type

D'après ce que je sais, vous n'avez pas besoin de créer un autre type. Vous pouvez utiliser :

std::ranges::subrange(MyInputIter{ root, pattern }, MySentinel{})

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