2012-01-09 23 views
14

Ambos actúan como una pila. Ambos tienen operaciones push y pop.¿Cuál es la diferencia principal entre un vector y una pila?

¿Hay alguna diferencia en algunos diseños de memoria?

+0

El contenedor predeterminado de Stacks es un deque - 'class Container = deque '. –

+0

@Jesse cualquier enlace para apoyar eso? ¿Y cuál es el contenedor predeterminado del vector? –

+0

Aquí hay un enlace a [MSDN] (http://msdn.microsoft.com/en-us/library/56fa1zk5%28v=VS.100%29.aspx). También debe obtener una [copia en PDF del borrador estándar de C++] (http://www.open-std.org/jtc1/sc22/wg21/) que contiene las definiciones. Vector es uno de los contenedores stl estándar, stack es una especialización * que usa uno * de los contenedores estándar. –

Respuesta

11

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

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

El punto principal es que, std::stack debe proporcionarse el contenedor subyacente. Por defecto es std::deque, pero también puede ser std::vector o std::list.
Por otro lado, std::vector se garantiza que es una matriz contigua a la que se puede acceder usando operator [].

+0

Usted dijo: 'El punto principal es que, std :: stack debe proporcionarse en el contenedor subyacente. Pero este ejemplo no muestra ningún esfuerzo adicional de suministro de un contenedor. http://www.cplusplus.com/reference/stl/stack/push/ –

+2

@AnishaKaul, eso es porque por * default * es, 'template > class stack;'. Entonces, si no proporciona ningún contenedor, asume que es 'std :: deque'. Ver el enlace que publiqué en la respuesta para más información. – iammilind

+0

Ok, gracias, el contenedor puede ser cambiado! Multa. ¿El contenedor predeterminado del vector es el conjunto dinámico creado por nuevo? –

7

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

Por ejemplo, para una pila, si presiona A y luego B en la parte posterior, se garantiza que se eliminarán en el orden B, entonces A. vector no garantiza eso.

+0

Bien, acabo de ver que el vector tiene una función 'borrar' que puede borrarse de los medios. Stack no tiene tal cosa. Por lo tanto, vector es una pila flexible. –

+0

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

+0

@ArunMu En realidad, por stack me refería al "contenedor" llamado stack. –

2

La pila es básicamente un caso especial de vector. En teoría, el vector puede crecer como lo desee. Puede eliminar elementos en cualquier índice en 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 la clase/estructura vectorial. No estoy seguro, pero creo que STL (C++) lo hace.

+0

La STL es algo viejo; probablemente se refiera a la Biblioteca estándar. Y no, su 'stack' no se define como herencia de' vector'; es un adaptador con plantilla que por defecto es 'deque' y para el cual se puede elegir un' vector' como una opción. –

11

No conozco todos los detalles de implementación, pero según this, la pila es un adaptador de contenedor. Se asegura de que el contenedor subyacente, que puede ser un vector, list o deque, funcione como una pila, es decir, solo permita push y pop, y no acceso aleatorio.

Por lo tanto, 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

+1 para ** el ** punto importante. El STL contiene varios ** adaptadores de contenedor ** que no obedecen los requisitos generales de los contenedores porque ... no lo son. –

0

Creo que la principal diferencia es que el vector es un contenedor de rango. Se puede usar fácilmente gracias a sus funciones miembro, como comienzo y final. El vector puede iniciarse fácilmente con {} 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; 
} 

Considerando que no es posible para std :: stack.

+0

Pero las personas que eligen usar 'std :: stack' ya saben que no les importa la iteración basada en rangos; más bien, quieren una interfaz concisa para insertar y mostrar elementos en un orden bien definido. –

Cuestiones relacionadas