David Villa Alises avatar David Villa Alises committed 100163e

más de algoritmos

Comments (0)

Files changed (2)

 	El truco con la definición de un puntero, al igual que con una
 	definición complicada, es leerla empezando por el
 	identificador e ir analizando la definición hacia afuera. El
-	[FIXME:especificador] <kw>const</kw> está ligado a la cosa
+	especificador <kw>const</kw> está ligado a la cosa
 	<quote>más cercana</quote>.  Así que si se quiere impedir
 	cambios en el elemento apuntado, escribe una definición
 	parecida a esta:
       other side of the int like this:
       -->
       <para>
-	Esta es la parte confusa. Podría pensar que hacer el puntero
+	Ahora viene la parte confusa. Podría pensar que hacer el puntero
 	inalterable en si mismo, es decir, impedir cualquier cambio en
 	la dirección que contiene <varname>u</varname>, es tan simple
 	como mover la palabra <kw>const</kw> al otro lado de la
       -->
       <para>
 	Para conseguir que el puntero sea inalterable, debe colocar el
-	[FIXME:especificador] <kw>const</kw> a la derecha del *:
+	especificador <kw>const</kw> a la derecha del *:
       </para>
 
 
     </para>
 
 <programlisting>
-template&lt;typename T> void copy(T* begin, T* end, T* dest) {
-while(begin != end)
-  *dest++ = *begin++;
+template&lt;typename T>
+void copy(T* begin, T* end, T* dest) {
+  while (begin != end)
+    *dest++ = *begin++;
 }
 </programlisting>
 
     vector, as in the following example:
     -->
     <para>
-      Decimos «casi» porque <function>copy()</function> puede procesas secuencias
-      delimitadas por cualquier cosas que actúe como un puntero, tal como un iterador. De
+      Decimos «casi» porque <function>copy()</function> puede procesar secuencias
+      delimitadas por cualquier cosa que actúe como un puntero, tal como un iterador. De
       ese modo, <function>copy()</function> se puede utilizar para duplicar un
       <classname>vector</classname>, como en el siguiente ejemplo.
     </para>
 <programlisting>
 template&lt;typename Iterator>
 void copy(Iterator begin, Iterator end, Iterator dest) {
-  while(begin != end)
+  while (begin != end)
     *begin++ = *dest++;
 }
 </programlisting>
 	conseguir esta flexibilidad, muchos algoritmos tienen una forma alternativa de
 	llamada que permite proporcionar un predicado, que es simplemente una función que
 	retorna un valor booleano basado en algún criterio. Suponga por ejemplo, que solo
-	quiere extraer de una secuencia de enteros, aquellos que son menores o iguales de
+	quiere extraer de una secuencia de enteros, aquellos que son menores o iguales a
 	15. Una versión de <function>copy()</function> llamada
 	<function>remove_copy_if()</function> puede hacer el trabajo, tal que así:
       </para>
 	punteros habituales, seguidos de un predicado de su elección. El predicado debe
 	ser un puntero a función[FIXME] que toma un argumento simple del mismo tipo que
 	los elementos de la secuencia, y que debe retornar un booleano. Aquí, la función
-	<function>gt15</function> returna verdadero si su argumento es mayor que 15. El
+	<function>gt15()</function> returna verdadero si su argumento es mayor que 15. El
 	algoritmo <function>remove_copy_if()</function> aplica <function>gt15()</function>
 	a cada elemento en la secuencia de entrada e ignora aquellos elementos para los
 	cuales el predicado devuelve verdad cuando escribe la secuencia de salida.
     application code.
     -->
     <para>
-
+      Como ha visto en los ejemplos anteriores de este mismo capítulo, probablemente
+      notará que la función <function>gt15()</function> tiene una utilidad limitada. ¿Qué
+      ocurre si quiere usar un número distinto de 15 como umbral? Podría necesitar un
+      <function>gt20()</function> or <function>gt25()</function>, por ejemplo. Tener que
+      escribir una función diferente para cada valor lleva tiempo y no es razonable porque
+      debe conocer todos los valores requeridos en el momento de desarrollar la
+      aplicación.
     </para>
 
     <!--
     individually and must therefore take only one parameter.
     -->
     <para>
-
+      Esta última limitación significa que no podrá usar valores en tiempo de
+      ejecución[FIXME] para realizar nuevas búsquedas, lo cual es inaceptable. Para
+      solucionarlo hace falta un modo de pasar información al predicado en tiempo de
+      ejecución. Por ejemplo, podría necesitar una función
+      <function>greater-than</function> que puede inicializar con un valor de comparación
+      arbitrario. Desafortunadamente, no puede pasar ese valor a una función por parámetro
+      porque los predicados unarios, tal como nuestro <function>gt15()</function>, se
+      aplican individualmente a cada valor de una secuencia y por tanto solo pueden tener
+      un parámetro.
     </para>
 
     <!--
     abstraction is called a function object.[89]
     -->
     <para>
-
+      La forma de resolver este dilema es, como siempre, creado una abstracción. Aquí,
+      necesitamos una abstracción que pueda actuar como una función que pueda almacenar
+      estado, sin interferir en el número de parámetros que acepta cuando se usa. Esta
+      abstracción se llama objeto-función (o «functor») [FIXME].
     </para>
 
     <!--
     constructors. Here is a function object that can be used in place of gt15( ):
     -->
     <para>
-
+      Un functor es una instancia de una clase que sobrecarga el
+      <function>operator()</function>, el operador de llamada a función. Este operador
+      permite que un objeto sea utilizado con la sintaxis de llamada de una función. Como
+      con cualquier otro objeto, puede inicializarse con sus constructores. Aquí hay un
+      functor que se puede utilizar en lugar de <function>gt15()</function>:
     </para>
 
 //: V2C06:GreaterThanN.cpp
     function call:
     -->
     <para>
-
+      El valor fijo de comparación con el que comparar (4) se pasa en el momento en el que
+      se crea <varname>f</varname>. La expresión <code>f(3)</code> es evaluada por el
+      compilador como la siguiente llamada a función.
     </para>
 
-    <!-- f.operator()(3); -->
-    <para>
-
-    </para>
+<programlisting>
+f.operator()(3);
+</programlisting>
 
     <!--
     which returns the value of the expression 3 > value, which is false when value
     is 4, as it is in this example.
     -->
     <para>
-
+      que retorna el valor de la expresión <code>3 > value</code> que es falsa cuando
+      <varname>value</varname> es 4, como ocurre en este ejemplo.
     </para>
 
     <!--
     give you a better understanding of how the generic algorithms work.
     -->
     <para>
-
+      Como estas comparaciones se aplican a tipos distintos de <type>int</type>, podría
+      tener sentido definir <function>gt\_n()</function> como una clase plantilla. No
+      necesita hacerlo porque la librería estándar ya lo ha hecho por usted. Las
+      siguientes descripciones de functors debería dejar el tema más claro, pero también
+      le darán una mejor comprensión de cómo funcionan los algoritmos genéricos.
     </para>
 
     <sect2>
 
     </para>
 
-    <!--
-    // Assumes pred is the incoming condition
-    replace_copy_if(begin, end, not1(pred));
-    -->
-    <para>
-
-    </para>
+    <programlisting>
+// Assumes pred is the incoming condition
+replace_copy_if(begin, end, not1(pred));
+</programlisting>
 
     <!--
     This seems reasonable, but when you remember that you want to be able to use
 //: V2C06:copy_if.h
 
 
-    <!-- Notice that the increment of begin cannot be integrated into the copy expression. -->
+    <!-- Notice that the increment of begin cannot be integrated into the copy
+    expression. -->
     <para>
 
     </para>
 .. ispell-local-dictionary: "castellano8"
 ..End:
 -->
+
+<!--  LocalWords:  functors
+ -->
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.