C ++ | lista STL Hablar de contenedores

directorio

A. contenedor lista Breve

Dos maneras de crear un contenedor .list

Tres operaciones de inserción de contenedores y borrar .list

IV. Utilice un iteradores de contenedores en la lista


A. contenedor lista Breve

 lista es un contenedor lista doblemente enlazada, lo que significa que es un nivel bajo de dos vías lista circular. archivo de cabecera es #include <lista>

Debido a que la lista es una lista doblemente enlazada recipiente, de manera que una dirección lógica continua, dirección física, pero no es continua, por lo que no podemos usar el puntero salta directamente al acceso a los elementos de una lista doblemente enlazada. Por ejemplo, en la figura anterior, arr puntero que apunta al primer nodo de una lista doblemente enlazada, el segundo elemento cuando queremos acceder a la lista doblemente enlazada, no puede ser * (arr + 2) para acceder de esta manera, también es nos referimos seguimiento del contenedor lista de acceso iterador no se puede acceder usando iterador + i (iterador iterador nombre, i = 0,1,2,3 ..... n) de esta manera.

Dos maneras de crear un contenedor .list

#include<iostream>
#include<vector>
#include<list>
#include<functional>

int main()
{
	std::list<int> lst1;
	std::list<int> lst2(10);//count
	std::list<int> lst3(10, 20);//count, value
	std::list<int> lst4(lst3.begin(), lst3.end());

	return 0;
}

En la construcción de la lista de contenedores lst1, llamando a la lista de clase es el constructor por defecto (todos los contenedores tienen un constructor por defecto), mientras que la construcción y no hizo nada.

En la construcción de la lista LST2 contenedor, que da explícitamente el tamaño inicial del recipiente 10, 10 y el tamaño de estos datos se establece en 0.

En la construcción de la lista de contenedores lst3, nos da explícitamente el tamaño inicial del recipiente 10, y estos datos explícitos conjunto de tamaño de 10 a 20. Es decir, insertamos 10 al valor de datos 20 en lst3.

En la construcción de la lista lst4 contenedor, se pasa el parámetro es un rango iterador, una posición después del inicio y el final de la próxima lst3 entrante, que se inserta en el lst3 datos para lst4 en.

Tres operaciones de inserción de contenedores y borrar .list

#include<iostream>
#include<vector>
#include<list>
#include<functional>

template<typename Iterator>
void Show(Iterator first, Iterator last)
{
	for (first; first != last; first++)
	{
		std::cout << *first << " ";
	}
	std::cout << std::endl;
}

int main()
{
	std::list<int> lst1;


	for (int i = 0; i < 3; i++)
	{
		lst1.push_back(i + 1);
	}// 1 2 3
	for (int i = 0; i < 3; i++)//3 2 1 1 2 3
	{
		lst1.push_front(i + 1);
	}
	Show(lst1.begin(), lst1.end());

	lst1.insert(++lst1.begin(), 6);
	Show(lst1.begin(), lst1.end());

	lst1.pop_front();
	Show(lst1.begin(), lst1.end());

	lst1.pop_back();
	Show(lst1.begin(), lst1.end());

	lst1.erase(++lst1.begin(), --lst1.end());
	Show(lst1.begin(), lst1.end());

	return 0;
}

 

push_back es decir, el tapón de extremo insertado en el final de la lista de elementos, la complejidad de tiempo de O (. 1) .

push_front cabeza es decir, inserción, insertado en el elemento de cabeza de la lista, el tiempo de complejidad de O (. 1) .

inserto elementos es decir, por la ubicación para insertar, insertar las cinco funciones siguientes sobrecarga, tiempo complejidad de O (1)

  1. iterador std :: lista <_Ty, _Alloc> :: insert <_Iter,> (const_iterator const _Where, _Iter _First, _Iter _Last), por ubicación (Donde) (Iter_First ~ Iter_Last) dentro del elemento en una sección, la sección representada por es una gama iterador.
  2. iterador std :: lista <_Ty, _Alloc> :: insert (const_iterator _Where, size_type _count, const _Ty y _Val), inserta el número de valor Val en la posición en la que este elemento.
  3. iterador std :: lista <_Ty, _Alloc> :: insert (const_iterator _Where, const _Ty y _Val), donde en esta posición para insertar un valor Val elemento, y este valor se modifica const bloqueado, no se puede modificar.
  4. iterador std :: lista <_Ty, _Alloc> :: insert (const_iterator _Where, _Ty && _Val), donde en esta posición para insertar un valor Val elemento, pero este valor no se modifica const cerradura.
  5. iterador std :: lista <_Ty, _Alloc> :: insert (const_iterator _Where, initializer_list <_Ty> _Ilist), utilizar el elemento de inicialización de la lista para insertar una nueva posición en la que, por ejemplo,
     lst1.insert(lst1.begin(),{1,3,4});

     

Esa cabeza pop_front borrar, borrar la lista del primer elemento, la complejidad en tiempo de O (1) .

Eso pop_back cola de borrar, borrar la lista de elementos de arrastre, la complejidad en tiempo de O (. 1) .

es decir, la posición de acuerdo a eliminar de borrado, la función de borrado ha los dos siguientes sobrecargado, el tiempo de complejidad de O (1)

  1. iterador de borrado (const_iterator const _First, const const_iterator _Last), borrar todos los elementos de una gama de iteradores.
  2.  iterador de borrado (const_iterator const _Where), elementos quitan Donde esta posición.

El acceso, la función es decir Show () de la complejidad de tiempo de O (n-) .

Así que lista las ventajas del envase es "rápida inserción o supresión en cualquier parte", la desventaja es "acceso menos eficiente."

IV. Utilice un iteradores de contenedores en la lista

#include<iostream>
#include<vector>
#include<list>
#include<functional>

int main()
{
	int arr[] = { 1, 3, 214, 23, 5, 3 };
	int len = sizeof(arr) / sizeof(arr[0]);

	std::vector<int> vec(arr, arr + len);//内存连续   随机访问迭代器
	std::list<int> lst(vec.begin(), vec.end());//内存不连续	双向迭代器  ++ --	

	std::cout << vec[2] << std::endl;
	//std::cout << lst[1] << std::endl;

	std::vector<int>::iterator vit = vec.begin() + 2;
	std::cout << *vit << std::endl;

	//std::list<int>::iterator  lit = lst.begin() + 2;
        //std::cout << *lit << std::endl;

	return 0;
}

 

Somos conscientes del vector contenedor subyacente es una matriz, sus direcciones lógicas y físicas son continuos, por lo que podemos utilizar para acceder al puntero de datos más un desplazamiento, y la dirección física del contenedor de lista de direcciones es discontinua, por lo que no puede más un puntero de desplazamiento para acceder a los datos. Nos vector de iterador contenedor conocido como iteradores de acceso aleatorio, envase y iterador de la lista llama iterador bidireccional.

En términos populares, iterador bidireccional puede no + i -i o la operación, si se quiere atravesar el contenedor, entonces sólo puede ser + o - operación. (I = 1,2,3 .... n)

E iteradores de acceso aleatorio, o -I + i llevan a cabo ambas operaciones se pueden realizar ++ o - las operaciones. (I = 1,2,3 .... n)

Publicado 61 artículos originales · ganado elogios 26 · vistas 5798

Supongo que te gusta

Origin blog.csdn.net/ThinPikachu/article/details/104906387
Recomendado
Clasificación