¿Cuál es la principal diferencia entre un vector y una pila?

6 minutos de lectura

Ambos actúan como una pila. Ambos tienen operaciones push y pop.

¿La diferencia está en algunos diseños de memoria?

  • El contenedor predeterminado de Stacks es un deque – class Container = deque<T> .

    – Jesse Bueno

    9 de enero de 2012 a las 9:08

  • @Jesse ¿algún enlace para respaldar eso? ¿Y cuál es el contenedor predeterminado del vector?

    – Chica_Acuario

    9 de enero de 2012 a las 9:08

  • Aquí hay un enlace a MSDN. También debe obtener un copia en pdf del borrador estándar de C++ que contiene las definiciones. Vector es uno de los contenedores stl estándar, stack es una especialización usando uno de los contenedores estándar.

    – Jesse bueno

    9 de enero de 2012 a las 9:14

std::vector tiene varias operaciones de accesibilidad y modificación en comparación con std::stack. En caso de std::stackes posible que deba realizar operaciones solo de manera sistemática, donde puede push() encima del último elemento o pop() el último elemento.

std::vector es más flexible en ese sentido, donde tiene varias operaciones, donde puedes insert() en medio o erase() entre.

El punto principal es que, estándar::pila se debe proporcionar el contenedor subyacente. Por defecto es std::dequepero puede ser std::vector o std::list también.
Por otra parte, std::vector se garantiza que es una matriz contigua a la que se puede acceder usando operator [].

  • Usted dijo: The major point is that, std::stack needs to be provided the underlying container. pero este ejemplo no muestra ningún esfuerzo adicional de suministrar un contenedor? cplusplus.com/reference/stl/stack/push

    – Chica_Acuario

    9 de enero de 2012 a las 9:07

  • @AnishaKaul, eso es porque por por defecto está, template < class T, class Container = deque<T> > class stack;. Entonces, si no proporciona ningún contenedor, se supone que es std::deque. Consulte el enlace que publiqué en la respuesta para obtener más información.

    – iammilind

    9 de enero de 2012 a las 9:09


  • Ok, gracias, ¡el contenedor se puede cambiar! Bien. El contenedor predeterminado de Vector es una matriz dinámica creada por new?

    – Chica_Acuario

    9 de enero de 2012 a las 9:11


  • @AnishaKaul, no std::vector es un contenedor independiente. Usa std::allocator y sí, podría estar usando new[].

    – iammilind

    9 de enero de 2012 a las 9:15


  • @Anisha: Cuando las personas usan la palabra “contenedor”, generalmente solo se refieren a los contenedores stl, aquí hay un Enlace que los enumera (aunque hay otros que se han agregado en C++ 11)

    – Jesse Bueno

    9 de enero de 2012 a las 9:17


Avatar de usuario de MikMik
MikMik

No estoy al tanto de todos los detalles de implementación, pero según esto, stack es un adaptador de contenedor. Se asegura de que el contenedor subyacente, que puede ser un vector, una lista o un deque, funcione como una pila, es decir, solo permite empujar y sacar, y no acceso aleatorio.

Entonces, un vector puede funcionar como una pila, pero una pila no puede funcionar como un vector, porque no puede insertar u obtener un elemento en una posición aleatoria.

  • +1 para la punto importante. El STL contiene varios adaptadores de contenedores que no cumplen los requisitos generales de los contenedores porque… no lo son.

    – Matthieu M.

    9 de enero de 2012 a las 9:57

stack es una pila. Solo puede empujar y hacer estallar. A vector puede hacer otras cosas, como insertar en el medio. Esto aumenta la flexibilidad, pero reduce las garantías.

Por ejemplo, para una pila, si empuja A y luego B hacia atrás, tiene la garantía de que se eliminarán en el orden B, luego A. vector no garantiza eso.

  • Correcto, acabo de ver que el vector tiene un erase Función que puede borrar de los medios. Stack no tiene tal cosa 🙂 entonces, vector es una pila flexible.

    – Chica_Acuario

    9 de enero de 2012 a las 9:02

  • @Anisha: No, esa es una forma incorrecta de asumir. Si ese fuera el caso, una lista de enlaces, una matriz simple, un deque, ¿pueden llamarse stack..rt? Pero la pila es un conjunto de propiedades definidas para un contenedor o una estructura de datos. Puede crear una pila a partir de la estructura de datos mencionada anteriormente si su implementación sigue siendo válida para las propiedades definidas para una pila.

    – Arunmu

    9 de enero de 2012 a las 9:59

  • @ArunMu En realidad, por pila me refería al “contenedor” llamado pila.

    – Chica_Acuario

    09/01/2012 a las 10:00

  • @AnishaKaul: Ohh. Solo estaba diciendo, incluso si agrega una función para el operador[] para la pila… ya no sería una pila 🙂 según los estándares :). solo estaba diciendo..

    – Arunmu

    9 de enero de 2012 a las 10:05

  • @AnishaKaul: Si está pensando en algo parecido a heredar el contenedor de pila, entonces NOOOO…. El contenedor STL no tiene destructores virtuales. Y creo que, según la implementación de STL, sería una tarea hercúlea hacerlo… correctamente para preservar la propiedad de la pila

    – Arunmu

    9 de enero de 2012 a las 10:13


Stack es básicamente un caso especial de vector. En teoría, el vector puede crecer como desee. Puede eliminar elementos en cualquier índice de un vector. Sin embargo, en el caso de una pila, puede eliminar elementos e insertarlos solo en su parte superior (de ahí un caso especial de vector).

De cara a muchas bibliotecas que proporcionan una implementación de una pila, generalmente heredan de las clases/estructuras vectoriales. No estoy seguro, pero creo que STL (C++) lo hace.

Como cplusplus.com sugiere:

Las pilas son un tipo de adaptador de contenedor, diseñado específicamente para operar en un contexto LIFO (último en entrar, primero en salir), donde los elementos se insertan y extraen solo de un extremo del contenedor.

La palabra clave aquí es solocomo en los elementos son solo insertado y extraído de un extremo del contenedor.

Usted dice que tanto los vectores como las pilas actúan como pilas, pero esto es solo parcialmente cierto. Vectores puede actúan como pilas, pero también pueden actuar de manera muy diferente a las pilas, al permitirle hacer cosas como insertar en cualquier índice, acceder a cualquier elemento, iterar sobre toda la estructura, etc.

Las pilas toman un contenedor (como, por ejemplo, un vector) y solo permiten interacciones similares a pilas con él. Esto garantiza efectivamente que todas las interacciones con el contenedor obedecerán a LIFO: solo se podrá acceder o eliminar el elemento agregado más recientemente en el contenedor.

Si desea un contenedor con un comportamiento similar al de una pila, debe usar una pila si es particularmente importante para usted que se comporte exclusivamente como una pila. Debe usar un vector si desea un comportamiento similar al de una pila, pero también puede querer hacer cosas como iterar sobre elementos o modificar elementos en posiciones arbitrarias, etc.

Avatar de usuario de Sam Mokari
sam mokari

Creo que la principal diferencia es que el vector es un contenedor basado en rango. Se puede usar fácilmente gracias a sus funciones miembro, como comenzar y terminar. El vector se puede iniciar fácilmente con el formulario {}. Podemos usar nuevas características de C++ moderno como bucles basados ​​en rangos.

vector<int> vec{ 7, 3, 1, 9, 5 };
for ( auto &i : vec ) {
    std::cout << i << std::endl;
}

Mientras que no es posible para std::stack.

¿Ha sido útil esta solución?