Directorio de artículos
3.2 contenedor de vectores
3.2.1 Concepto básico de vector
Características:
- La estructura de datos vectoriales es muy similar a una matriz , también conocida como matriz de un solo extremo.
La diferencia entre vector y matriz ordinaria:
- La diferencia es que la matriz es un espacio estático, mientras que el vector se puede expandir dinámicamente
Expansión dinámica:
- No es para conectar 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.
[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-WNJcgE4S-1615014786757) (assets / clip_image002.jpg)]
- El iterador del contenedor de vectores es un iterador que admite acceso aleatorio
3.2.2 constructor de vectores
Función descriptiva:
- Crear un contenedor de vectores
Prototipo de función:
vector<T> v;
// Usando la implementación de la clase de implementación de la plantilla, constructor predeterminadovector(v.begin(), v.end());
// Copia los elementos en el rango de v [begin (), end ()) a sí mismo.vector(n, elem);
// El constructor copia n elementos a sí mismo.vector(const vector &vec);
// Copiar constructor.
Ejemplo:
#include <vector>
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int> v1; //无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int> v2(v1.begin(), v1.end());
printVector(v2);
vector<int> v3(10, 100);
printVector(v3);
vector<int> v4(v3);
printVector(v4);
}
int main() {
test01();
system("pause");
return 0;
}
** Resumen: ** Los múltiples métodos de construcción de vector no son comparables, solo utilícelos de manera flexible
3.2.3 operación de asignación de vectores
Función descriptiva:
- Asignar un valor al contenedor de vectores
Prototipo de función:
-
vector& operator=(const vector &vec);
// Sobrecargar el operador de signo igual -
assign(beg, end);
// Asignar una copia de los datos en el intervalo [beg, end) a sí mismo. -
assign(n, elem);
// Asignar n copias de elem a sí mismo.
Ejemplo:
#include <vector>
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//赋值操作
void test01()
{
vector<int> v1; //无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int>v2;
v2 = v1;
printVector(v2);
vector<int>v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);
vector<int>v4;
v4.assign(10, 100);
printVector(v4);
}
int main() {
test01();
system("pause");
return 0;
}
Resumen: El método de asignación de vectores es relativamente simple, use operator = o asigne.
3.2.4 Capacidad y tamaño del vector
Función descriptiva:
- Operaciones sobre la capacidad y tamaño del contenedor de vectores
Prototipo de función:
-
empty();
// Determine si el contenedor está vacío -
capacity();
// La capacidad del contenedor -
size();
// Devuelve el número de elementos en el contenedor -
resize(int num);
// Vuelva a especificar la longitud del contenedor como num. Si el contenedor se alarga, la nueva posición se llenará con el valor predeterminado.// Si el contenedor se vuelve más corto, se eliminan los elementos al final que exceden la longitud del contenedor.
-
resize(int num, elem);
// Vuelva a especificar la longitud del contenedor como num. Si el contenedor se alarga, llene la nueva posición con el valor elem.// Si el contenedor se acorta, se eliminan los elementos al final que exceden la longitud del contenedor
Ejemplo:
#include <vector>
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
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() {
test01();
system("pause");
return 0;
}
para resumir:
- Determine si está vacío - vacío
- Devuelve el número de elementos - tamaño
- Capacidad del contenedor de retorno - capacidad
- Vuelva a especificar el tamaño - cambiar el tamaño
3.2.5 inserción y eliminación de vectores
Función descriptiva:
- Insertar y eliminar el contenedor de vectores
Prototipo de función:
push_back(ele);
// Insertar elemento ele al finalpop_back();
// Eliminar el último elementoinsert(const_iterator pos, ele);
// El iterador apunta a la posición pos para insertar el elemento eleinsert(const_iterator pos, int count,ele);
// El iterador apunta a la posición pos e inserta elementos de conteo eleerase(const_iterator pos);
// Elimina el elemento apuntado por el iteradorerase(const_iterator start, const_iterator end);
// Elimina los elementos entre el inicio y el final del iteradorclear();
// Eliminar todos los elementos del contenedor
Ejemplo:
#include <vector>
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//插入和删除
void test01()
{
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() {
test01();
system("pause");
return 0;
}
para resumir:
- Tapón final - push_back
- Eliminar cola - pop_back
- Insertar - insertar (iterador de posición)
- Eliminar - borrar (iterador de posición)
- Claro - claro
3.2.6 acceso a datos vectoriales
Función descriptiva:
- Acceder a operaciones sobre los datos en el vector
Prototipo de función:
at(int idx);
// Devuelve los datos apuntados por el índice idxoperator[];
// Devuelve los datos apuntados por el índice idxfront();
// Devuelve el primer elemento de datos en el contenedorback();
// Regresar al último elemento de datos en el contenedor
Ejemplo:
#include <vector>
void test01()
{
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;
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() {
test01();
system("pause");
return 0;
}
para resumir:
- Además de usar iteradores para obtener los elementos en el contenedor de vectores, [] y at también se pueden usar
- front devuelve el primer elemento del contenedor
- back devuelve el último elemento del contenedor
3.2.7 contenedor de intercambio de vectores
Función descriptiva:
- Realizar el intercambio de elementos en los dos contenedores.
Prototipo de función:
swap(vec);
// Intercambia vec con sus propios elementos
Ejemplo:
#include <vector>
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
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 test02()
{
vector<int> v;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
}
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
v.resize(3);
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
//收缩内存
vector<int>(v).swap(v); //匿名对象
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
}
int main() {
test01();
test02();
system("pause");
return 0;
}
Resumen: el intercambio puede intercambiar dos contenedores, lo que puede lograr efectos prácticos de contracción de la memoria
3.2.8 Espacio reservado del vector
Función descriptiva:
- Reducir el número de expansiones del vector al expandir dinámicamente la capacidad
Prototipo de función:
reserve(int len);
// El contenedor reserva longitudes de elementos len, la posición reservada no se inicializa y los elementos son inaccesibles.
Ejemplo:
#include <vector>
void test01()
{
vector<int> v;
//预留空间
v.reserve(100000);
int num = 0;
int* p = NULL;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
if (p != &v[0]) {
p = &v[0];
num++;
}
}
cout << "num:" << num << endl;
}
int main() {
test01();
system("pause");
return 0;
}
Resumen: si la cantidad de datos es grande, puede usar la reserva para reservar espacio al principio
Para obtener más información, siga la cuenta oficial: