3.3 Contenedores STL de uso común -- 2.contenedor vectorial

2. contenedor de vectores

2.1 Concepto básico de vector

Función:

  • La estructura de datos vectoriales es muy similar a una matriz , también conocida como matriz de un solo extremo.

La diferencia entre el vector y la matriz ordinaria:

  • La diferencia es que la matriz es un espacio estático y el vector se puede expandir dinámicamente.

Expansión dinámica:

  • No es para continuar el nuevo espacio después del espacio original, sino para encontrar un espacio de memoria más grande y luego copiar los datos originales al nuevo espacio para liberar el espacio original.
  • El iterador del contenedor vectorial es un iterador que admite acceso aleatorio

2.2 constructor de vectores

Función descriptiva:

  • Crear un contenedor de vectores

Prototipo de función:

  • vector v; // usa la implementación de la plantilla implementación de la clase, constructor predeterminado
  • vector(v.begin(), v.end()); // copia los elementos en el intervalo v[begin(), end()) a sí mismo
  • vector(n, elem); // El constructor copia n elementos a sí mismo
  • vector(const vector &vec); // copia constructor

Ejemplo de código:

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

void printVector(vector<int> & v)
{
    
    
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

void test_01()
{
    
    
	// 1. 采用模板实现类实现,默认构造参数
	vector<int> v1; // 无参构造
	for (int i = 0; i < 10; i++)
	{
    
    
		v1.push_back(i);
	}
	printVector(v1);
	
	// 2. 将v[begin(), end())区间中的元素拷贝给本身
	vector<int> v2(v1.begin(), v1.end());
	printVector(v2);

	// 3. 构造函数将n个elem拷贝给本身
	vector<int> v3(10, 100);
	printVector(v3);

	// 4.拷贝构造函数
	vector<int> v4(v3);
	printVector(v4);
}

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
// 100 100 100 100 100 100 100 100 100 100
// 100 100 100 100 100 100 100 100 100 100

2.3 Operación de asignación de vectores (=, asignar)

Función descriptiva:

  • Asignar un valor al contenedor de vectores.

Prototipo de función:

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

Código de muestra:

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

void printVector(vector<int>& v)
{
    
    
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

// 赋值操作
void test_01()
{
    
    
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
    
    
		v1.push_back(i);
	}
	printVector(v1);
	// 1. 重载符号操作符
	vector<int> v2;
	v2 = v1;
	printVector(v2);
	
	// 2. assign(begin, end) //将[begin, end)区间中的数据拷贝赋值给本身
	vector<int> v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

	// 3.assign(n, elem) // 将n个elem拷贝赋值给本身
	vector<int> v4;
	v4.assign(10, 100);
	printVector(v4);
}
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
// 0 1 2 3 4 5 6 7 8 9
// 100 100 100 100 100 100 100 100 100 100

2.4 Capacidad y tamaño del vector (vacío, capacidad, tamaño, redimensionamiento)

Función descriptiva:

  • Operaciones de capacitancia y tamaño en contenedores vectoriales

Prototipo de función:

  • vacio(); // Comprobamos si el contenedor esta vacio
  • capacidad(); //La capacidad del contenedor
  • size(); // devuelve el número de elementos en el contenedor
  • resize(int num); // Vuelva a designar la longitud del contenedor como num, si el lado del contenedor es largo, la nueva posición se llenará con el valor predeterminado, si el contenedor se acorta, los elementos al final exceden el se eliminará la longitud del contenedor
  • resize(int num, elem); // Vuelva a designar la longitud del contenedor como num, si el contenedor se vuelve más largo, llene la nueva posición con el valor de elem, si el contenedor se vuelve más corto, elimine los elementos al final que exceder la longitud del contenedor

Código de muestra:

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

void printVector(vector<int> &v)
{
    
    
	for (vector<int>::iterator it  = v.begin(); it != v.end(); it++)
	{
    
    
		cout << *it << ' ';
	}
	cout << endl;
}

void test_01()
{
    
    
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
    
    
		v1.push_back(i);
	}
	printVector(v1);

	if (v1.empty())
	{
    
    
		cout << "v1为空" << endl;
	}
	else
	{
    
    
		cout << "v1不为空" << endl;
		cout << "v1的容量 = " << v1.capacity() << endl;
		cout << "v1的大小为 = " << v1.size() << endl;
	}

	//resize重新指定大小, 若指定的更大,默认用0填充新位置,可以利用重载版本替换默认填充
	v1.resize(15, 10);
	printVector(v1);
	// resize重新指定大小,若指定更小,超出部分元素删除
	v1.resize(5);
	printVector(v1);
}
int main()
{
    
    
	test_01();
	system("pause");
	return 0;
}
// 0 1 2 3 4 5 6 7 8 9
// v1不为空
// v1的容量 = 13
// v1的大小为 = 10
// 0 1 2 3 4 5 6 7 8 9 10 10 10 10 10
// 0 1 2 3 4

2.5 inserción y eliminación de vectores (push_back, pop_back, insert, erase, clear)

Función descriptiva:

  • Operaciones de inserción y eliminación en contenedores vectoriales

Prototipo de función:

  • push_back(ele); // inserta el elemento ele al final
  • pop_back(); // borra el último elemento
  • insert(const_iterator pos, ele); // el iterador apunta a la posición pos para insertar el elemento ele
  • insert(const_iterator pos, int count, ele); // El iterador apunta a la posición pos para insertar elementos de conteo
  • erase(const_iterator pos); // borra el elemento apuntado por el iterador
  • erase(const_iterator start, const_iterator end); // Elimina los elementos entre el inicio y el final del iterador
  • clear(); // borra todos los elementos del contenedor

ejemplo de código

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

void printVector(vector<int> v)
{
    
    
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

// 插入和删除
void test_01()
{
    
    
	vector<int> v1;
	// 尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	printVector(v1);

	// 尾删
	v1.pop_back();
	printVector(v1);
	// 插入
	v1.insert(v1.begin(), 100);
	printVector(v1);
	v1.insert(v1.begin(), 2, 1000);
	printVector(v1);
	// 删除
	v1.erase(v1.begin());
	printVector(v1);
	// 清空
	v1.erase(v1.begin(), v1.end());
	v1.clear();
	printVector(v1);
}

int main() 
{
    
    
	test_01();
	system("pause");
	return 0;
}
// 10 20 30 40 50
// 10 20 30 40
// 100 10 20 30 40
// 1000 1000 100 10 20 30 40
// 1000 100 10 20 30 40
// 

2.6 Acceso a datos vectoriales (en, [], adelante, atrás)

Función descriptiva:

  • Acceso a datos en vector

Prototipo de función:

  • at(int index); // 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<vector>

void test_01()
{
    
    
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
    
    
		v1.push_back(i);
	}
	// 通过[]方式访问元素
	for (int i = 0; i < v1.size(); i++)
	{
    
    
		cout << v1[i] << " ";
	}
	cout << endl;
	// 通过at()方式访问元素
	for (int i = 0; i < v1.size(); i++)
	{
    
    
		cout << v1.at(i) << " ";
	}
	cout << endl;
	cout << "v1的第一个元素为: " << v1.front() << endl;
	cout << "v1的最后一个元素为:" << v1.back() << endl;
}

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
// v1的第一个元素为: 0
// v1的最后一个元素为:9

Contenedor de intercambio de 2.7 vectores (intercambio)

Función descriptiva:

  • Lograr el intercambio de elementos en los dos contenedores
  • El uso inteligente puede lograr un efecto práctico de reducción de la memoria.

Prototipo de función:

  • swap(vec); // intercambia vec con sus propios elementos

Ejemplo de código:

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

void printVector(vector<int> v)
{
    
    
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
    
    
		cout << *it << " ";
	}
	cout << endl;
}

void test_01()
{
    
    
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
    
    
		v1.push_back(i);
	}
	cout << "互换容器前" << endl;
	printVector(v1);
	vector<int> v2;
	for (int i = 10; i >0; i--)
	{
    
    
		v2.push_back(i);
	}
	printVector(v2);

	// 互换容器
	cout << "互换容器" << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}

void test_02()
{
    
    
	// 创建vector容器,存放一个比较大的数
	vector<int> v;
	for (int i = 0; i < 100000; i++)
	{
    
    
		v.push_back(i);
	}
	cout << "1. v的容量为:" << v.capacity() << endl;
	cout << "1. v的大小为:" << v.size() << endl;
	v.resize(3);
	// resize后,容量不变,造成资源浪费
	cout << "2. v的容量为:" << v.capacity() << endl;
	cout << "2. v的大小为:" << v.size() << endl;
	// 收缩内存  
	// vector<int>(v) 匿名对象,拷贝构造
	vector<int>(v).swap(v); 
	cout << "3. v的容量为:" << v.capacity() << endl;
	cout << "3. v的大小为:" << v.size() << endl;
}

int main()
{
    
    
	test_01();
	test_02();
	system("pause");
	return 0;
}
// 互换容器前
// 0 1 2 3 4 5 6 7 8 9
// 10 9 8 7 6 5 4 3 2 1
// 互换容器
// 10 9 8 7 6 5 4 3 2 1
// 0 1 2 3 4 5 6 7 8 9
// 1. v的容量为:138255
// 1. v的大小为:100000
// 2. v的容量为:138255
// 2. v的大小为:3
// 3. v的容量为:3
// 3. v的大小为:3

2.8 vector espacio reservado (reserva)

Función descriptiva:

  • Reduzca el número de expansiones del vector al expandir dinámicamente la capacidad

Prototipo de función:

  • reserve(int len); // Reserve el espacio del elemento len en el contenedor, la posición reservada no se inicializa y el elemento es inaccesible

Ejemplo de código:

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

void test_01()
{
    
    
	vector<int> v;
	// 预留空间
	v.reserve(100000);
	// num统计扩展空间次数
	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 10000; i++)
	{
    
    
		v.push_back(i);
		if (p != &v[0])
		{
    
    
			p = &v[0];
			num++;
		}
	}
	cout << "num: " << num << endl;
}
int main()
{
    
    
	test_01();
	system("pause");
	return 0;
}
// num: 1

Supongo que te gusta

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