English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在c++中,vector是一个十分有用的容器,下面通过本文给大家介绍C++中vector容器使用详细说明,具体介绍如下所示
1. 在C++中的详细说明
vector es C++Es parte de la biblioteca de plantillas estándar, es una biblioteca multifuncional que puede operar con varios tipos de estructuras de datos y algoritmos, y es una biblioteca de clases de plantillas y funciones.
vector se considera una contenedor porque puede almacenar varios tipos de objetos de manera similar a un contenedor, en otras palabras, vector es un array dinámico que puede almacenar tipos de datos arbitrarios y puede aumentar y comprimir datos.
2. Para usar vector, debe incluir el siguiente código en su archivo de encabezado:
#include
vector pertenece al espacio de nombres std, por lo tanto, debe usar la restricción de nombre, como se muestra a continuación para completar su código:
using std::vector; vector vInts;
o bien juntos, usando el nombre completo:
std::vector vInts;
Se recomienda utilizar el modo de nombre de dominio global:
using namespace std;
3. Inicialización
vector // Crear un vector vacío. vector c1(c2) // Copiar un vector vector c(n) // Crear un vector que contenga n datos, los datos se han producido mediante la construcción por defecto. vector c(n, elem) // Crear un vector que contenga copias de n elem. vector c(beg,end) // Crear un vector que contenga copias de n elem.
4. Función de destrucción
c.~vector () // Destruir todos los datos, liberar la memoria
5. Función miembro
c.assign(beg,end)c.assign(n,elem)
Asignar los datos en el intervalo [beg; end) a c. Asignar copias de n elem a c.
c.at(idx)
Devolver el dato apuntado por el índice idx, si idx está fuera de rango, lanzar out_of_range.
c.back() // Devolver el último dato, sin verificar si este dato existe.
c.begin() // Devolver la dirección del primer dato del iterador.
c.capacity() // Devolver la cantidad de datos en el contenedor.
c.clear() // Remover todos los datos del contenedor.
c.empty() // Determinar si el contenedor está vacío.
c.end() // Apuntar al siguiente elemento del elemento terminal del iterador, apuntar a un elemento inexistente.
c.erase(pos) // Eliminar el dato en la posición pos, devolver la posición del siguiente dato.
c.erase(beg,end) //Eliminar los datos en el intervalo [beg, end), devolver la posición del siguiente dato.
c.front() // Devolver el primer dato.
get_allocator // Devolver una copia utilizando el constructor.
c.insert(pos,elem) // Insertar una copia de elem en la posición pos, devolver la nueva posición de los datos.
c.insert(pos,n,elem) // Insertar n datos elem en la posición pos. No hay valor de retorno.
c.insert(pos,beg,end) // Insertar los datos en el intervalo [beg, end) en la posición pos. No hay valor de retorno.
c.max_size() // Devolver la cantidad máxima de datos en el contenedor.
c.pop_back() // Eliminar el último dato.
c.push_back(elem) // Agregar un dato al final.
c.rbegin() // Devolver el primer dato de la cola inversa.
c.rend() // Devolver la posición siguiente del último dato de la cola inversa.
c.resize(num) // Reasignar la longitud de la cola.
c.reserve() // Mantener una capacidad adecuada.
c.size() // Devuelve la cantidad real de datos en el contenedor.
c1.swap(c2)
swap(c1,c2) // Asignar c1y c2Intercambio de elementos. La operación es similar.
operator[] // Devuelve una referencia a la posición especificada del contenedor.
6. Ejemplo de uso:
6.1. Crear un vector
El contenedor vector proporciona varios métodos de creación, a continuación, se presentan algunos métodos comunes.
Crear un objeto vector vacío de tipo Widget:
vector vWidgets;
Crear un vector que contiene500 widgets de tipo Widget:
vector vWidgets(500);
Crear un vector que contiene500 widgets de tipo Widget, todos inicializados a 0:
vector vWidgets(500, Widget(0));
Crear una copia de Widget:
vector vWidgetsFromAnother(vWidgets);
Agregar un dato a vector
El método predeterminado para agregar datos a vector es push_back().
push_back() función indica agregar datos al final de vector y asignar memoria según sea necesario.
Por ejemplo: agregar a vector10datos, se debe escribir el código siguiente:
for(int i= 0;i<10; i++) { vWidgets.push_back(Widget(i)); }
6.2 Obtener los datos en la posición especificada de vector
Los datos dentro de vector se asignan dinámicamente, la serie de asignaciones de espacio de push_back() a menudo depende de archivos o algunas fuentes de datos.
Si quieres saber cuántos datos contiene vector, puedes usar empty().
Para obtener el tamaño de vector, puedes usar size().
Por ejemplo, si quieres obtener el tamaño de un vector v, pero no sabes si está vacío o ya contiene datos, si está vacío, puedes establecerlo a-1, puedes usar el siguiente código para implementarlo:
int nSize = v.empty() ? -1 : static_cast(v.size());
6.3 Acceder a los datos en vector
Se utilizan dos métodos para acceder a vector.
1、 vector::at()
2、 vector::operator[]
operator[] se utiliza principalmente para la compatibilidad con el lenguaje C. Puede operar de la misma manera que un array en C.
Pero at() es nuestra opción preferida, ya que at() realiza comprobaciones de límites, y si se accede a más allá del rango de vector, lanzará una excepción.
Dado que operator[] tiende a causar algunos errores, raramente lo usamos y a continuación lo verificaremos:
Analiza el siguiente código:
vector v; v.reserve(10); for(int i=0; i<7; i++) { v.push_back(i); } try {int iVal1 = v[7]; // no comprobación de límites - no lanzará una excepción int iVal2 = v.at(7); // comprobación de límites - lanzará una excepción si está fuera de rango } catch(const exception& e) { cout << e.what(); }
6.3 Eliminar datos del vector
El vector puede agregar datos muy fácilmente, también puede extraer datos fácilmente, y el vector también proporciona erase(), pop_back(), clear() para eliminar datos, cuando se eliminan datos, debe saber si se eliminan los datos del final, o todos los datos, o datos individuales.
Para usar remove_if(), debe incluir el siguiente código en el archivo de cabecera:
#include
Remove_if() tiene tres parámetros:
1、 iterator _First: un puntero de iteración que apunta al primer dato.
2、 iterator _Last: un puntero de iteración que apunta al último dato.
3、 predicate _Pred: una función de condición que puede realizar operaciones de iteración.
6.4 función de condición
La función de condición es un puntero a función básico que devuelve resultado de sí o no según la condición definida por el usuario, o es un objeto de función.
Este objeto de función necesita soportar todas las operaciones de llamada a función, sobrecargando operator()().
remove_if() se hereda de unary_function, permitiendo pasar datos como condición.
por ejemplo, si se desea eliminar datos coincidentes de un vector, si la cadena contiene un valor, desde este valor, desde este valor final.
primero debe establecerse una estructura de datos para contener estos datos, similar al código siguiente:
#include enum findmodes { FM_INVALID = 0, FM_IS, FM_STARTSWITH, FM_ENDSWITH, FM_CONTAINS }; typedef struct tagFindStr { UINT iMode; CString szMatchStr; }; FindStr; typedef FindStr* LPFINDSTR;
luego se procesa la condición de juicio:
class FindMatchingString : public std::unary_function { public: FindMatchingString(const LPFINDSTR lpFS) : m_lpFS(lpFS) {} bool operator()(CString& szStringToCompare) const { bool retVal = false; switch (m_lpFS->iMode) { case FM_IS: { retVal = (szStringToCompare == m_lpFDD->szMatchStr); break; } case FM_STARTSWITH: { retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength()) == m_lpFDD->szWindowTitle); break; } case FM_ENDSWITH: { retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength()) == m_lpFDD->szMatchStr); break; } case FM_CONTAINS: { retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1); break; } } return retVal; } private: LPFINDSTR m_lpFS; };
Con esta operación puede eliminar datos de manera efectiva de vector:
FindStr fs; fs.iMode = FM_CONTAINS; fs.szMatchStr = szRemove; vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());
Remove(), remove_if() y todas las operaciones de eliminación están basadas en un rango de iteración, no pueden operar en los datos del contenedor.
Por lo tanto, al usar remove_if(), se opera realmente en la parte superior de los datos del contenedor.
Ver que remove_if() realmente modifica las direcciones de iteración según la condición, hay algunos datos residuales al final de los datos, los datos que necesitan ser eliminados. La posición de los datos restantes puede no ser la de los datos originales, pero no lo saben.
Llame a erase() para eliminar los datos residuales.
Atención a la ejemplo superior donde se elimina el resultado de remove_if() y los datos de rango vs.enc() mediante erase().
7Ejemplo integrado:}}
//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; #include #include using namespace std; struct STResult { double Time; double Xp; double Yp; int id; }; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } vector ResultVector; void __fastcall test() { //test //vector ResultVector; STResult stritem; stritem.Time = .1; stritem.Xp = .1; stritem.Yp = .1; stritem.id = 1; ResultVector.push_back( stritem ); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { test(); assert(ResultVector[0].id == 1); } //---------------------------------------------------------------------------
Lo que se mencionó anteriormente es lo que el editor les ha presentado a ustedes, C++Descripción detallada del contenedor vector de medio, espero que sea útil para todos. Si tienen alguna pregunta, déjenme un mensaje, el editor responderá a tiempo. También muy agradecido por el apoyo a la página web de tutorial de grito!
Declaración: Este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#w3Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#w