2010-02-01 5 views
8

Existe-t-il des enveloppes standard (de boost) standard/de facto autour d'algorithmes standard qui fonctionnent avec des conteneurs définissant begin et end. Laissez-moi vous montrer ce que je veux dire avec le code:Enveloppes d'algorithmes STL standard/de facto C++

// instead of specifying begin and end 
std::copy(vector.begin(), vector.end(), output); 
// write as 
xxx::copy(vector, output); 

Je sais qu'il peut être écrit facilement, mais je suis à la recherche spécifiquement pour quelque chose omniprésente. Merci.

+1

Une excellente question en effet. J'ai toujours trouvé que l'idée de baser les algorithmes sur les itérateurs était assez compliquée ... 'std :: copy (input.begin(), input.end(), std :: back_inserter (output)), ça me fait vraiment mal aux yeux ... Malheureusement, chaque fois qu'il s'agit de modifier la structure du conteneur sous-jacent (en ajoutant/supprimant) des éléments, alors 'Boost.Range' ne fonctionne pas:/ –

Répondre

8

Il existe une extension de la bibliothèque Boost Range appelée RangeEx qui contient des wrappers de plage pour tous les algorithmes stl, plus de nouveaux.

Il a récemment été accepté dans Boost et n'est donc pas encore dans la version "officielle" actuelle (1.41). Jusqu'à ce que cela change, vous pouvez download the latest version à partir du Boost Vault.

Je ne sais pas si cela fera partie de la norme C++, mais le fait que ce soit dans Boost signifie que ce sera la norme de facto.

+0

merci, boost voûte est assez bon pour moi. – Anycorn

+1

fyi, RangeEx a été intégré dans Boost Range à partir de 1.43.0 – sstock

1

Le seul cas où je l'ai vu quelque chose comme ça sont les algorithmes basés sur la bibliothèque boost::range, mais même ceux-ci ne modifient pas réellement les algorithmes standards comme std::copy ou std::remove_if - l'algorithme en question doit être écrit à prendre avantage d'une telle enveloppe de gamme.

Pour un exemple, voir la bibliothèque Boost String Algorithms.

2

Le prochain standard va (j'espère!) L'amender. En attendant, jetez un oeil à Boost.Range et à ses diverses utilisations bien que je ne connaisse pas d'interface avec les algorithmes standard.

+0

voulez-vous dire TR1? – Anycorn

+0

TR1 n'inclut pas d'installation de portée. La page Wikipedia pour C++ 0x énumère quelques éléments sur la sémantique des plages, mais ils font référence à la boucle for basée sur la plage qui est nouvelle en C++ 0x. AFAIK les algorithmes standard ne sont pas modifiés dans le nouveau standard - bien que je puisse me tromper .... –

+0

@unknown: Non, TR1 n'est pas strictement une nouvelle norme, c'est juste un tas de recommandations. Je parlais de C++ 0x (bien que cela soit effectivement absent de l'article Wikipédia - mais il était * planifié.) Je ne suis pas sûr que cela soit arrivé dans le brouillon final). –

0

je vais ajouter ma propre conclusion: les bibliothèques de sources Adobe (rangex de boost remplace une partie des algorithmes) ASL