Por qué son las listas que se utilizan con poca frecuencia en Ir?

Soy nuevo en el Ir, y muy emocionados. Pero, en todas las lenguas con las que he trabajado extensamente: Delphi, C#, C++, Python – las Listas son muy importantes ya que pueden cambiar de tamaño dinámicamente, en contraposición a las matrices.

En Golang, de hecho, hay un list.Liststruct, pero veo muy poca documentación al respecto – si en Ir Por Ejemplo o los tres Van de los libros que tengo – Summerfield, Chisnal y Balbaert – todos ellos pasan mucho tiempo en las matrices y los sectores y, a continuación, saltar a los mapas. En el código fuente de los ejemplos, también me encuentro con poco o ningún uso de list.List.

También parece que, a diferencia de Python, Range no es compatible Lista – gran inconveniente de la OMI. Me estoy perdiendo algo?

Rebanadas son sin duda agradable, pero todavía tienen que estar basados en una matriz con un código rígido de tamaño. Que es donde la Lista que viene. Hay una forma de crear una matriz /sector en el Ir sin un duro codificadas tamaño de la matriz? ¿Por qué es la Lista de ignorados?

  • Tenga en cuenta que Python list tipo no está implementado usando una lista enlazada: se comporta similar a un Go sector, que en ocasiones requieren copias de datos para ampliar.
  • debidamente comprobada y corregida.
  • C++ no utilizar listas ampliamente. std::list es casi siempre una mala idea. std::vector es lo que usted desea administrar una secuencia de elementos. Por las mismas razones std::vector se prefiere, Vaya segmento es el preferido así.
  • entendido. En mi pregunta std::vector<T> fue incluido en la list categoría porque no requiere de ningún valor constante para la inicialización y se pueden cambiar de tamaño de forma dinámica. Cuando me hizo la pregunta, no estaba claro para mí que Ir a la slice podría ser utilizado de una manera similar – todo lo que he leído en el momento en que se explica que una rebanada fue un «punto de vista de una matriz», y como en la mayoría de los otros idiomas, plain vanilla matrices en Ir necesita ser declarado con un tamaño constante. (Pero gracias por el aviso.)
  • Inexplicable downvotes no son útiles. Por favor explique….
InformationsquelleAutor Vector | 2014-01-24

7 Kommentare

  1. 73

    Casi siempre cuando usted está pensando en una lista de uso de un sector en lugar de Ir. Las rebanadas son dinámicamente cambian de tamaño. Subyacente es un contiguos trozo de memoria que pueden cambiar de tamaño.

    Son muy flexibles como verás si lees el SliceTricks la página de la wiki.

    Aquí hay un extracto :-

    Copia

    b = make([]T, len(a))
    copy(b, a) //or b = append([]T(nil), a...)

    Corte

    a = append(a[:i], a[j:]...)

    Eliminar

    a = append(a[:i], a[i+1:]...) //or a = a[:i+copy(a[i:], a[i+1:])]

    Eliminar sin la preservación del orden

    a[i], a = a[len(a)-1], a[:len(a)-1]

    Pop

    x, a = a[len(a)-1], a[:len(a)-1]

    Empuje

    a = append(a, x)

    Actualización: Aquí hay un enlace a un blog de todo sobre los sectores de la marcha del equipo en sí, que hace un buen trabajo de explicar la relación entre sectores y matrices y cortar la parte interna.

    • OK, esto es lo que estaba buscando. Tuve un malentendido acerca de las rebanadas. Usted no tiene que declarar una matriz a utilizar un trozo. Usted puede asignar un sector y que asigna el almacenamiento de respaldo. Sonidos similares a los arroyos en Delphi o C++. Ahora entiendo por qué todo el alboroto acerca de las rebanadas.
    • tenga en cuenta que somethimes la creación de un sector que apunta a una «estática» de la matriz es una útil modismo.
    • como cuando?
    • rebanadas de crear una «vista» en su copia de la matriz. A menudo, usted sabe de antemano que los datos a una función que opere en el va tienen tamaño fijo (o va a tener el tamaño de no más de una cantidad conocida de bytes; esto es bastante común para los protocolos de red). Así que usted puede declarar una matriz para mantener estos datos en su función y, a continuación, cortar como-antes de pasar a estos sectores a las funciones llamadas etc.
  2. 44

    Hice esta pregunta hace un par de meses, cuando empecé a investigar Ir. Desde entonces, todos los días he estado leyendo acerca de Ir, y la codificación en Ir.

    Porque no he recibido una clara respuesta a esta pregunta (aunque yo había aceptado una respuesta) ahora voy a responder yo mismo, basado en lo que he aprendido desde que me preguntan es:

    Hay una forma de crear una matriz /sector en el Ir sin un duro codificadas
    el tamaño de un array?

    Sí. Rodajas no requieren de un código rígido de la matriz de slice de:

    var sl []int = make([]int,len,cap)

    Este código asigna rebanada sl, de tamaño len con una capacidad de caplen y cap son variables que se pueden asignar en tiempo de ejecución.

    ¿Por qué es list.List ignorado?

    Parece que las principales razones list.List parecen tener poca atención en Ir son:

    • Como ha sido explicado en @Nick Craig-Madera de la respuesta, hay
      prácticamente nada de lo que se puede hacer con las listas que no se puede hacer
      con rebanadas, a menudo de manera más eficiente y con un limpiador, más
      elegante sintaxis. Por ejemplo, la gama de construcción:

      for i:=range sl {
        sl[i]=i
      }

      no se puede utilizar con la lista un estilo de C para el bucle. Y en
      muchos de los casos, C++ colección de estilo de la sintaxis debe ser utilizado con listas:
      push_back etc.

    • Quizás más importante, list.List no es inflexible – es muy similar a las listas de Python y diccionarios, que permiten la mezcla de diferentes tipos de juntas en la colección. Esto parece ir en sentido contrario
      para el enfoque de las cosas. Go es un muy fuertemente lenguaje escrito – por ejemplo, las conversiones de tipo implícito nunca permitió que en el Go, incluso un upCast de int a int64 debe ser
      explícito. Pero todos los métodos de la lista.Lista de vacío interfaces –
      nada pasa.

      Una de las razones por las que dejé de Python y se trasladó a Ir es por
      de este tipo de debilidad en Python, tipo de sistema, aunque Python
      dice ser «inflexible» de la OMI (no lo es). Golist.Listparece
      ser una especie de «mestizo», nacido de C++ vector<T> y Python
      List(), y es quizás un poco fuera de lugar en sí mismo.

    No me sorprendería si en algún momento en un futuro no muy lejano, nos encontramos con la lista.Lista obsoleta en Ir, aunque tal vez no permanecerá, para dar cabida a aquellos raras situaciones donde, incluso mediante el uso de buenas prácticas de diseño, un problema puede resolverse mejor con una colección que contiene varios tipos. O tal vez está ahí para proporcionar un «puente» para C de la familia a los desarrolladores para que se sienta cómodo con Ir antes de aprender los matices de los sectores, los cuales son únicos para Ir, AFAIK. (En algunos aspectos, rebanadas parecen similares a la secuencia de clases en C++ o Delphi, pero no del todo.)

    A pesar de que viene de un Delphi/C++/Python fondo, en mi exposición inicial, me he encontrado list.List a ser más familiar que Ir del rodajas, como me he vuelto más cómodo con Ir, he ido de nuevo y cambiar todos mis listas a las cortes. No he encontrado nada que slice y/o map no me permiten hacer, que necesito para utilizar list.List.

    • href=»https://golang.org/ref/spec#Introduction» >Ir es un idioma de propósito general diseñado con sistemas de programación de la mente. es inflexible… – ¿ellos también tienen ni idea de qué están hablando? El uso de la inferencia de tipo no significa GoLang es no inflexible. También me dio una clara ilustración de este punto : las conversiones de tipo Implícito no están permitidos en GoLang, incluso cuando hasta la fundición. (signo de Exclamación no hacen más correcta. Guardar para ninos blogs.)
    • los mods borrado tu comentario, a mí no. Simplemente decir que alguien «no saben lo que están hablando!» es inútil a menos que se proporcione una explicación y prueba. Además, esto se supone para ser un profesional de lugar, por lo que nos puede dejar fuera de los signos de exclamación y la hipérbole – guardar para ninos blogs. Si usted tiene un problema, sólo por decir «yo no veo cómo puede usted decir GoLang es tan inflexible cuando tenemos a,B y C, que parecen contradecir esto.» Quizás la cooperativa de acuerdo, o explicar por qué piensan que está mal. Que sería de gran utilidad y sonido profesional comentario,
    • comprueba de manera estática del lenguaje, que cumplir algunas reglas antes de que el código se ejecuta. Lenguajes, como C darte una primitiva tipo de sistema: su código de tipo de verificación correctamente, pero volar en tiempo de ejecución. Usted sigue yendo en este espectro, que Ir a buscar, que le da mejores garantías de C. sin embargo en ninguna parte cerca de tipo de sistemas en lenguajes como OCaml (que no es el final de espectro tampoco). Diciendo: «Vaya, es quizá el más fuerte de lenguaje escrito ahí fuera» es absolutamente incorrecto. Es importante para los desarrolladores a entender las propiedades de seguridad de los distintos idiomas, para que puedan hacer una elección informada.
    • Ejemplos concretos de cosas que faltan de Ir: la falta de medicamentos genéricos obliga a usar dinámica de moldes. La falta de enumeraciones/capacidad de verificar el interruptor de la integridad implica más dinámico de cheques donde otros idiomas puede proporcionar estática garantías.
    • Yo) dijo tal vez 2) estamos hablando de idiomas en bastante uso común. Go no es muy fuerte en estos días,pero Vaya ha 10545 preguntas marcadas,aquí OCaml ha 3,230. 3) Las deficiencias en Ir citar la OMI no tiene mucho que con «inflexible», (una nebulosa plazo que no necesariamente se correlacionan con el tiempo de compilación de cheques). 4) «Es importante ..» – lo siento pero eso no tiene sentido-si alguien está leyendo esto, probablemente se está utilizando ya. Dudo que alguien está usando esta respuesta para decidir si Ir es para ellos. OMI usted debe encontrar algo más importante que ser «profundamente molesta» acerca de…
    • He cambiado el idioma en el que se encuentra tan «profundamente preocupante». 🙂 No es necesario para la respuesta.

  3. 9

    Creo que es porque no hay mucho que decir acerca de ellos, como el container/list paquete es bastante auto-explicativo una vez absorbidos ¿cuál es el jefe de Ir lenguaje para trabajar con datos genéricos.

    En Delphi (sin genéricos) o en C sería almacenar punteros o TObjects en la lista y, a continuación, los echó de nuevo a sus tipos reales cuando la obtención de la lista. En C++ STL listas de plantillas y, por tanto, con parámetros por tipo, y en C# (en estos días) listas son genéricos.

    En Ir, container/list almacena los valores de tipo interface{} que es un tipo especial capaz de representar los valores de cualquier otro (real) de tipo almacenar un par de punteros: uno para el tipo de información contenida en valor, y un puntero al valor (o el valor directamente, si su tamaño no es mayor que el tamaño de un puntero). Así que cuando usted desea agregar un elemento a la lista, usted acaba de hacer que la medida de los parámetros de la función de tipo interface{} aceptar los valores de director de operaciones de cualquier tipo. Pero al extraer los valores de la lista, y lo que para trabajar con sus tipos reales para tipo asert ellos o hacer una tipo de interruptor en ellos—ambos enfoques son sólo diferentes maneras de hacer esencialmente la misma cosa.

    He aquí un ejemplo tomado de la aquí:

    package main
    
    import ("fmt" ; "container/list")
    
    func main() {
        var x list.List
        x.PushBack(1)
        x.PushBack(2)
        x.PushBack(3)
    
        for e := x.Front(); e != nil; e=e.Next() {
            fmt.Println(e.Value.(int))
        }
    }

    Aquí podemos obtener el valor de un elemento utilizando e.Value() y, a continuación, escriba-reivindican como int un tipo de la original insertado valor.

    Usted puede leer sobre el tipo de afirmaciones y tipo de interruptores en Eficaces «Ir» o cualquier otra introducción del libro. El container/list del paquete de la documentación de los resúmenes de todos los métodos de las listas de apoyo.

    • Así, desde Ir de listas no actúan como otras listas o vectores: no pueden ser indexados (Lista[i]) AFAIK (tal vez me estoy perdiendo de algo…) y que no admiten la Gama, algunas de las explicaciones sería el fin. Pero gracias a tipo de afirmaciones/interruptores – que era algo que me faltaba hasta ahora.
    • sí, que no admite rangos porque range es un lenguaje builtin que sólo es aplicable a builtin tipos de matrices, sectores, cadenas y mapas) porque cada «invocación» o range en el hecho de producir diferentes de código de máquina para atravesar el contenedor que se aplica.
    • en cuanto a la indexación… en el paquete de la documentación es claro que container/list proporciona una doble lista enlazada. Esto significa que la indexación es un O(N) operación (usted tiene que comenzar en la cabeza y recorrer más de cada elemento hacia la cola, contando), y uno de el Ir a la piedra angular de paradigmas de diseño es no tener oculto costos de rendimiento; con otra que poner un poco pequeña carga adicional para el programador (la aplicación de una función de indización para una doble lista enlazada es una de las 10 de la línea de obviedad) está bien. Por lo que el contenedor sólo implementa la «canónica» de las operaciones sensibles para su especie.
    • tenga en cuenta que en Delphi TList y otros de su calaña uso de una matriz dinámica debajo, para la ampliación de dicha lista no es barato, mientras que la indexación es es barato. Así, mientras que los de Delphi «listas» mira como la abstracción de las listas en el hecho de que son las matrices, lo que se haría uso de las rodajas en Ir. Lo que quiero resaltar es que se esfuerza por Ir a poner las cosas claras sin acumulando «bellas abstracciones» de «ocultar» los detalles del programador. Go enfoque es más parecido a C, donde explícitamente saber cómo sus datos se presenta y cómo acceder a él.
    • La lista Delphi clases (y la mayoría de los otros idiomas también ) proporcionan una capacidad de propiedad que pre-asigna una determinada cantidad de memoria, por lo que las cosas no tienen que ser re-barajan como la lista crece.
    • precisamente lo que se puede hacer con Go rodajas que tienen tanto en longitud y capacidad.
    • Sí, he visto la capacidad de parámetro. Tiene que pasar algún tiempo jugando con rebanadas de. La manera en que los libros describen rodajas no parecen llegar al corazón de lo que ustedes me están diciendo. Que SliceTricks página parece mucho más interesante que lo que yo he visto. Me gustaría que hubiera una muy buena práctica y detallada libro en Go – «Ir en una cáscara de Nuez» de estilo. Chisnall del libro es excelente, pero es muy breve. Summerfield la escritura no me importa – él siempre parece estar por todo el mapa – tengo algunos de sus libros. Balbaert el libro es bueno, pero no parece estar muy bien ejecutado/traducido, etc.

  4. 4

    Nota que Ir de sectores puede ser ampliado a través de la append() función integrada. Aunque esto a veces requiere de la realización de una copia de la copia de la matriz, no va a suceder cada vez que, desde Ir a la sobre-tamaño de la nueva matriz, dando una capacidad mayor que el reportado longitud. Esto significa que una posterior operación de anexar puede ser completado sin otra copia de los datos.

    Mientras usted termina con más copias de datos que con el código equivalente implementado con listas enlazadas, se elimina la necesidad de asignar los elementos en la lista de forma individual y la necesidad de actualizar la Next punteros. Para muchos de los usos de la matriz de la base de la aplicación proporciona una mejor o lo suficientemente bueno rendimiento, de modo que es lo que se ha destacado en el lenguaje. Curiosamente, el de Python estándar list tipo es también la matriz de respaldo y tiene características de rendimiento similares al anexar valores.

    Que dijo, hay casos en los que las listas enlazadas son una mejor opción (por ejemplo, cuando usted necesita para insertar o eliminar elementos de inicio/medio de una larga lista), y es por eso que una biblioteca estándar de la aplicación es siempre. Supongo que no agregue ningún especiales características de lenguaje para trabajar con ellos debido a que estos casos son menos frecuentes que aquellas donde las rebanadas se utilizan.

    • Aún así, rodajas debe estar de vuelta por una matriz con un código rígido de tamaño, ¿correcto? Eso es lo que no me gusta.
    • El tamaño de una sección no está codificado en el código fuente del programa, si es eso lo que quieres decir. Puede ser ampliado de forma dinámica a través de la append() operación, como he explicado (que a veces implican una copia de datos).
  5. 3

    A menos que el sector se actualiza muy frecuentemente (eliminar, añadir elementos en lugares al azar) de la memoria de la contigüidad de las rebanadas se ofrecen excelentes proporción de aciertos de caché en comparación con listas enlazadas.

    Scott Meyer habla sobre la importancia de la caché..
    https://www.youtube.com/watch?v=WDIkqP4JbkE

  6. 3

    list.List se implementa como una lista doblemente vinculada. Matriz basada en listas (vectores en C++, o cortes en golang) son mejor opción que las listas enlazadas en la mayoría de las condiciones, si no con frecuencia insertar en el medio de la lista. La amortizado en el momento de la complejidad para anexar es O(1) por tanto la matriz de la lista y lista enlazada aunque la lista de matrices se ha de extender la capacidad y la copia a través de los valores existentes. Matriz de las listas de más rápido acceso aleatorio, menor consumo de memoria, y lo que es más importante amigable para que el recolector de basura debido a que no hay punteros dentro de la estructura de datos.

  7. 2

    De: https://groups.google.com/forum/#!msg/golang-nueces/mPKCoYNwsoU/tLefhE7tQjMJ

     
    Depende mucho de la cantidad de elementos en la lista, 
    si un verdadero lista o una rebanada más eficiente 
    cuando usted necesita para hacer muchas eliminaciones en el "centro" de la lista. 
    
    #1 
    Los elementos más, el menos atractivo se convierte en una rebanada. 
    
    #2 
    Cuando el orden de los elementos no es importante, 
    es más eficaz el uso de un sector y 
    eliminación de un elemento mediante su sustitución por el último elemento en el sector y 
    reslicing el sector para reducir el tamaño del len por 1 
    (como se explicó en el SliceTricks wiki) 
    

    Así

    el uso de la rebanada

    1. Si el orden de los elementos de la lista No es importante, y necesita eliminar, sólo

    uso de la Lista de intercambiar el elemento a borrar con el último elemento, & re-sector a (longitud-1)

    2. cuando los elementos son más (lo que sea más medios)


    There are ways to mitigate the deletion problem --
    e.g. the swap trick you mentioned or
    just marking the elements as logically deleted.
    But it's impossible to mitigate the problem of slowness of walking linked lists.

    Así

    el uso de la rebanada

    1. Si usted necesita la velocidad en el cruce de

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea