3.3 STL contenedores de uso común -- 3. contenedor deque

3. deque contenedor

3.1 Concepto básico del contenedor deque

Función:

  • Matriz de dos extremos, que puede realizar operaciones de inserción y eliminación en la cabecera

La diferencia entre deque y vector:

  • La inserción y eliminación de la cabeza del vector es ineficiente y cuanto mayor es el volumen de datos, menor es la eficiencia. (requiere que la posición de cada elemento se mueva hacia atrás)
  • Deque es relativamente hablando, la inserción y eliminación de la cabeza será más rápida que el bloque vectorial.
  • Vector accede a los elementos más rápido que deque, lo cual está relacionado con la implementación interna de los dos

El principio de funcionamiento interno de deque:

  • Hay un controlador central dentro del deque, que mantiene el contenido de cada búfer y almacena datos reales en el búfer.
  • El controlador central mantiene la dirección de cada buffer, haciendo uso de deque como un espacio de memoria continuo

3.2 constructor de deque

Función descriptiva:

  • construcción de contenedores deque

Prototipo de función:

  • deque deqT; // constructor predeterminado
  • deque(beg, end); // El constructor copia los elementos en el rango [begin, end) a sí mismo
  • deque(n, elem); // El constructor copia n elementos a sí mismo
  • deque(const deque &deq);// copiar constructor

Ejemplo de código:

#include<iostream>
using namespace std;
#include<deque>

void printDeque(const deque<int>& d)
{
    
    
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

void test_01() 
{
    
    
	deque<int> d1; // 无参构造
	for (int i = 0; i < 10; i++)
	{
    
    
		d1.push_back(i);
	}
	printDeque(d1);
	
	// 构造函数将[begin, end) 区间中的元素拷贝给本身
	deque<int> d2(d1.begin(), d1.end());
	printDeque(d2);
	
	// 构造函数将n个elem拷贝给本身
	deque<int> d3(10, 1000);
	printDeque(d3);
	// 拷贝构造函数
	deque<int> d4(d3);
	printDeque(d4);
}
int main()
{
    
    
	test_01();
	system("pause");
	return 0;
}
// 0 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
// 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000
// 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000

3.3 operación de asignación deque (=, asignar)

Función descriptiva:

  • Asigne un valor al contenedor deque

Prototipo de función:

  • deque& operator=(const deque &deque); // operador igual sobrecargado
  • asignar (beg, end); // asigna la copia de datos en el rango [begin, end) a sí mismo
  • asignar (n, elem); // asignar n elem se copia a sí mismo

Ejemplo de código:

#include<iostream>
using namespace std;
#include<deque>

void printDeque(const deque<int> &d)
{
    
    
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it ++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

//  赋值操作
void test_01()
{
    
    
	deque<int> d1;
	for (int i = 0; i < 10; i++)
	{
    
    
		d1.push_back(i);
	}
	printDeque(d1); // 0 1 2 3 4 5 6 7 8 9

	deque<int> d2;
	d2 = d1;
	printDeque(d2); // 0 1 2 3 4 5 6 7 8 9

	deque<int> d3;
	d3.assign(d1.begin(), d1.end());
	printDeque(d3);  // 0 1 2 3 4 5 6 7 8 9

	deque<int> d4;
	d4.assign(10, 1000);
	printDeque(d4);  // 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000
}

int main()
{
    
    
	test_01();
	system("pause");
	return 0;
}

3.4 Operación de tamaño de deque (vacío, tamaño, cambio de tamaño)

Función descriptiva:

  • Operar sobre el tamaño del contenedor deque

Prototipo de función:

  • deque.empty(); // determina si el contenedor está vacío
  • deque.size(); // devuelve el número de elementos en el contenedor
  • deque.resize(num); // Vuelva a especificar la longitud del contenedor como num. Si el contenedor se vuelve más largo, la nueva posición se llenará con el valor predeterminado. Si el contenedor se vuelve más corto, los elementos al final que excedan la longitud del contenedor será eliminada
  • deque.resize(num, elem); // Vuelva a designar la longitud del contenedor como num. Si el contenedor se vuelve más largo, complete la nueva posición con el valor de elem. Si el contenedor se vuelve más corto, el elemento al final excede la longitud del contenedor será borrado

Ejemplo de código:

#include<iostream>
using namespace std;
#include <deque>

void printDeque(const deque<int>& d)
{
    
    
	for(deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

// 大小操作
void test()
{
    
    
	deque<int> d1;
	for (int i = 0; i < 10; i++)
	{
    
    
		d1.push_back(i);
	}
	printDeque(d1); // 0 1 2 3 4 5 6 7 8 9
	// 判断容器是否为空
	if (d1.empty())
	{
    
    
		cout << "d1为空!" << endl;
	}
	else
	{
    
    
		cout << "d1不为空" << endl;  // d1不为空 
		// 统计大小
		cout << "d1的大小为:" << d1.size() << endl; // d1的大小为:10
	}

	// 重新指定大小
	d1.resize(15, 1);
	printDeque(d1);  // 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1

	d1.resize(5);
	printDeque(d1);  // 0 1 2 3 4
}

int main() 
{
    
    
	test();
	system("pause");
	return 0;
}

3.5 inserción y eliminación de deque (push_back, pop_back, pop_front, insert, clear, erase)

Función descriptiva:

  • Insertar y eliminar datos en el contenedor deque

Prototipo de función:

  • push_back(pos, elem); // Agrega un dato al final del contenedor
  • push_front(pos, elem); // Agrega un dato en la cabecera del contenedor
  • pop_back(); // borra el último elemento del contenedor
  • pop_front(); // Borra los primeros datos del contenedor

Operación de posición especificada:

  • insert(pos, elem); // Inserta una copia del elemento elem en pos, devuelve la posición de los nuevos datos
  • insert(pos, n, elem); // inserta datos de n elem en la posición pos, sin valor de retorno
  • insert(pos, beg, end); // Inserta los datos en el rango [beg, end) en la posición pos, sin valor de retorno
  • clear(); // Borra todos los datos del contenedor
  • erase(beg, end); // elimina los datos en el rango [beg, end] y devuelve la posición de los siguientes datos
  • erase(pos); // Borra los datos en la posición pos y devuelve la posición de los siguientes datos

Ejemplo de código:

#include<iostream>
using namespace std;
#include<deque>

void printDeque(const deque<int>& d) 
{
    
    
	for (deque<int>::const_iterator  it = d.begin(); it != d.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

// 两端操作
void test_01() 
{
    
    
	deque<int> d;
	// 尾插
	d.push_back(10);
	d.push_back(20);
	// 头插
	d.push_front(100);
	d.push_front(200);
	printDeque(d); // 200 100 10 20

	// 尾删
	d.pop_back();
	// 头删
	d.pop_front();
	printDeque(d); // 100 10
}

// 插入
void test_02()
{
    
    
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(100);
	d.push_back(200);
	printDeque(d); // 10 20 100 200

	d.insert(d.begin(), 1000);
	printDeque(d);  // 1000 10 20 100 200

	d.insert(d.begin(), 2, 1000);
	printDeque(d);  // 1000 1000 1000 10 20 100 200

	deque<int> d2;
	d2.push_back(1);
	d2.push_back(2);
	d2.push_back(3);
	d.insert(d.begin(), d2.begin(), d2.end());
	printDeque(d); // 1 2 3 1000 1000 1000 10 20 100 200
}

// 删除
void test_03()
{
    
    
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(100);
	d.push_back(200);
	printDeque(d);  // 10 20 100 200

	d.erase(d.begin());
	printDeque(d); // 20 100 200

	d.erase(d.begin(), d.end());
	d.clear();
	printDeque(d); // 
}

int main() 
{
    
    
	test_01();
	test_02();
	test_03();
	system("pause");
	return 0;
}

3.6 Acceso a datos Deque (en, [], adelante, atrás)

Función descriptiva:

  • Acceso a datos en deque

Prototipo de función:

  • at(int, idx); // Devuelve los datos a los que apunta el índice idx
  • operator[]; // Devuelve los datos a los que apunta el índice idx
  • front(); // devuelve el primer elemento de datos en el contenedor
  • back(); // devuelve el último elemento de datos en el contenedor

Ejemplo de código:

#include<iostream>
using namespace std;
#include<deque>

void printDeque(const deque<int>& d)
{
    
    
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

// 数据存取
void test_01() 
{
    
    
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_front(100);
	d.push_front(200);
	// 使用[]获取数据元素
	for (int i = 0; i < d.size(); i++)
	{
    
    
		cout << d[i] << " ";
	}
	cout << endl;  // 200 100 10 20
	// 使用at获取数据元素
	for (int i = 0; i < d.size(); i++)
	{
    
    
		cout << d.at(i) << " ";
	}
	cout << endl; // 200 100 10 20
	cout << "front: " << d.front() << endl;  // front: 200
	cout << "back: " << d.back() << endl;    // back: 20
}

int main()
{
    
    
	test_01();
	system("pause");
	return 0;
}

3.7 clasificación deque (ordenar)

Función descriptiva:

  • Uso de algoritmos para ordenar contenedores deque

algoritmo:

  • sort(iterator beg, iterator end); // Ordenar los elementos en los intervalos inicial y final

Ejemplo de código:

#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>

void printDeque(const deque<int>& d)
{
    
    
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

void test_01()
{
    
    
	deque<int>  d;
	d.push_back(10);
	d.push_back(20);
	d.push_front(100);
	d.push_front(200);
	printDeque(d); // 200 100 10 20
	// 排序
	sort(d.begin(), d.end());
	printDeque(d); // 10 20 100 200
}
int main()
{
    
    
	test_01();
	system("pause");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/yewumeng123/article/details/131151268
Recomendado
Clasificación