[Conocimientos básicos de C ++] vector

introducción de vectores

  1. Un vector es un contenedor de secuencia que representa una matriz de tamaño variable.
  2. Al igual que las matrices, los vectores también utilizan espacio de almacenamiento contiguo para almacenar elementos. Esto significa que puede usar subíndices para acceder a los elementos de un vector, que es tan eficiente como una matriz. Pero a diferencia de una matriz, su tamaño se puede cambiar dinámicamente y su tamaño será procesado automáticamente por el contenedor.
  3. Esencialmente, vector usa una matriz asignada dinámicamente para almacenar sus elementos. Cuando se insertan nuevos elementos, esta matriz debe reasignarse para aumentar el espacio de almacenamiento. El método consiste en asignar una nueva matriz y luego mover todos los elementos a esta matriz. En términos de tiempo, esta es una tarea relativamente costosa, porque cada vez que se agrega un nuevo elemento al contenedor, el vector no reasigna su tamaño cada vez.
  4. Estrategia de asignación de vectores: vector asignará algo de espacio adicional para adaptarse a un posible crecimiento, porque el espacio de almacenamiento es más grande que el espacio de almacenamiento real necesario. Las diferentes bibliotecas adoptan diferentes estrategias para equilibrar el uso y la reasignación del espacio. Pero en cualquier caso, la redistribución debe ser un aumento logarítmico del tamaño del intervalo, de modo que cuando se inserta un elemento al final, se haga en complejidad de tiempo constante.
  5. Por lo tanto, el vector ocupa más espacio de almacenamiento, con el fin de obtener la capacidad de administrar el espacio de almacenamiento y crecer dinámicamente de manera efectiva.
  6. En comparación con otros contenedores de secuencia dinámica (deques, listas y forward_lists), el vector es más eficiente al acceder a elementos, y agregar y eliminar elementos al final es relativamente eficiente. Para otras operaciones de eliminación e inserción que no están al final, la eficiencia es menor. Mejor que iteradores y referencias unificados para listas y forward_lists

Interfaz común

estructura

vector explícito (const allocator_type & alloc = allocator_type ());
vector explícito (size_type n, const value_type & val = value_type (),
const allocator_type & alloc = allocator_type ());
vector (const vector & x);
plantilla <class InputIterator>

vector (InputIterator primero, InputIterator último, const allocator_type & alloc = allocator_type ());

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

void test()
{
    
    
	class A {
    
    

	};

	vector<int>v1; 
	vector<char>v2;
	vector<A>v3;
	vector<A> v4 (10);
	A a;
	vector<A> v5(20, a);

	vector<int>v7(10);
	vector<char>v8(10);
	vector<int *>v9(10);

	char arr[] = "123456";
	vector<char>v10(arr, arr + sizeof(arr) / sizeof(arr[0]));

}

int main()
{
    
    
	test();
	return 0;
}

Inserte la descripción de la imagen aquí

El contenedor v7 que almacena datos enteros se inicializa a todo 0,
el contenedor v8 que almacena datos de caracteres se inicializa a todo '\ 0',
el contenedor v9 que almacena el puntero entero se inicializa a todo NULL;

Inserte la descripción de la imagen aquí

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


template<class T>
void Print(const vector<T>&vec)
{
    
    
	vector<T>::const_iterator it = vec.begin();
	while (it != vec.end())
	{
    
    
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
int main()
{
    
    
	char arr[] = "123456";
	vector<char>v10(arr, arr + sizeof(arr) / sizeof(arr[0]));
	Print(v10);
	return 0;
}

Inserte la descripción de la imagen aquí

Iterador

Uso de iterador Descripción
Iterador de avance: comienzo + fin Obtenga el iterador / const_iterator de la primera posición de datos, obtenga el iterador / const_iterator de la siguiente posición de los últimos datos
Iterador inverso: rbegin + rend Obtenga el reverse_iterator de la última posición de datos, obtenga el reverse_iterator de la primera posición de datos
	char arr[] = "123456";
	vector<char>v10(arr, arr + sizeof(arr) / sizeof(arr[0]));


	vector<char>::iterator it = v10.begin();
	while (it != v10.end())
	{
    
    
		cout << *it << " ";
		++it;
	}
	cout << endl;

Inserte la descripción de la imagen aquí

Nota: El
iterador también se puede escribir aquí para cambiar el valor en el contenedor. El
iterador inverso es similar al iterador directo, pero la dirección es opuesta (++, - las operaciones son opuestas)

Mira un ejemplo:

#define _CRT_SECURE_NO_WARNINGS 1

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


template<class T>
void Print(const vector<T>&vec)
{
    
    
	vector<T>::const_iterator it = vec.begin();
	while (it != vec.end())
	{
    
    
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

void test()
{
    
    
	class A {
    
    

	};

	vector<int>v1; 
	vector<char>v2;
	vector<A>v3;
	vector<A> v4 (10);
	A a;
	vector<A> v5(20, a);

	vector<int>v7(10);
	vector<char>v8(10);
	vector<int *>v9(10);

	char arr[] = "123456";
	vector<char>v10(arr, arr + sizeof(arr) / sizeof(arr[0]));


	Print(v7);
	Print(v8);
	Print(v9);
	Print(v10);

}

int main()
{
    
    

	test();
	return 0;
}

Resultado de salida:
Inserte la descripción de la imagen aquí

v8 es todo '\ 0' tan invisible

Asignación

void test()
{
    
    
	vector<int>v(3, 2);
	Print(v);
	//赋值
	v.assign(5,1);
	Print(v);

	vector<int>v2(6, 2);
	v.assign(v2.begin(),v2.end());
	Print(v);

	int arr[] = {
    
     1,2,3,4,5,6,7 };
	v.assign(arr,arr+sizeof(arr)/sizeof(arr[0]));
	Print(v);

}

Inserte la descripción de la imagen aquí

Agregar, eliminar, verificar y modificar

vector agregar, eliminar, verificar y cambiar Descripción
hacer retroceder Tapón de cola
pop_back Eliminar cola
encontrar Encontrar
insertar insertar
borrar Eliminar los datos en la ubicación especificada
intercambio Intercambia el espacio de datos de dos vectores
operador[] Acceda como una matriz (se informará la excepción después de cruzar el límite)

problema de falla del iterador vectorial

La función principal del iterador es permitir que el algoritmo no se preocupe por la estructura de datos subyacente, que en realidad es un puntero o encapsula el puntero. Por ejemplo, el iterador de un vector es el puntero original T *. Por lo tanto, el iterador no es válido, de hecho, el espacio al que apunta el puntero correspondiente en la parte inferior del iterador se destruye, y el uso de un espacio libre hará que el programa se bloquee (es decir, si continúa usando el iterador invalidado, el programa puede fallar).

  1. Las operaciones que provocarán cambios en el espacio subyacente pueden ser la falla del iterador, como: redimensionar, reservar, insertar, asignar, push_back, etc.
  2. Eliminar la operación de la posición especificada elemento-borrar

Solución : el iterador no es válido Solución: antes de usarlo, simplemente reasigne el iterador.

Supongo que te gusta

Origin blog.csdn.net/weixin_43962381/article/details/115267058
Recomendado
Clasificación