2010-02-01 11 views
8

Existen envoltorios estándares (de hecho) estándar (de refuerzo) alrededor de algoritmos estándar que funcionan con contenedores que definen inicio y finalización. Te voy a enseñar lo que quiero decir con el código:Envoltorios de algoritmo STL estándar/de facto C++

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

Sé que se puede escribir fácilmente, pero estoy en busca específicamente para algo omnipresente. Gracias.

+1

Una pregunta excelente por cierto. Siempre he encontrado bastante desordenada la idea de basar los algoritmos en los iteradores ... 'std :: copy (input.begin(), input.end(), std :: back_inserter (output));' eso realmente me duele los ojos ... Desafortunadamente, cada vez que se trata de modificar la estructura de los elementos del contenedor subyacente (agregar/eliminar), entonces 'Boost.Range' no funciona:/ –

Respuesta

8

Hay una extensión de la biblioteca Boost Range llamada RangeEx que contiene contenedores de rango para todos los algoritmos STL, más algunos nuevos.

Ha sido aceptado recientemente en Boost y todavía no está en la versión "oficial" actual (1.41). Hasta que esto cambie, puede download the latest version de Boost Vault.

No sé si alguna vez se convertirá en parte del estándar C++, pero el hecho de que esté en Boost significa que será de facto estándar.

+0

gracias, impulsar la bóveda es lo suficientemente bueno para mí. – Anycorn

+1

fyi, RangeEx se ha integrado en Boost Range desde 1.43.0 – sstock

1

El único caso en el que he visto algo como esto son los algoritmos basados ​​en la biblioteca boost::range, pero incluso éstas en realidad no se modifican los algoritmos estándar como std::copy o std::remove_if - el algoritmo en cuestión debe ser escrito para tomar ventaja de tal envoltorio de rango.

Para ver un ejemplo, consulte la biblioteca Boost String Algorithms.

2

El siguiente estándar (con suerte) lo modificará. Mientras tanto, eche un vistazo a Boost.Range y sus diversos usos, aunque no conozco una interfaz para los algoritmos estándar.

+0

¿te refieres a TR1? – Anycorn

+0

TR1 no incluye una instalación de rango. La página de Wikipedia para C++ 0x enumera algunos elementos sobre la semántica de rango, pero se están refiriendo al bucle for del rango que es nuevo en C++ 0x. AFAIK los algoritmos estándar no están siendo modificados en el nuevo estándar, aunque podría estar equivocado ... –

+0

@unknown: No, TR1 no es estrictamente un nuevo estándar, es solo un montón de recomendaciones. Estaba hablando de C++ 0x (aunque eso de hecho falta en el artículo de Wikipedia, pero * fue * planeado. No estoy seguro si llegó al borrador final). –

0

voy a añadir mi propia conclusión: bibliotecas de código Adobe (rangex de impulso reemplaza algoritmos parte) ASL