Share via


Clase CArray

Admite matrices que se parecen a las matrices de C, pero puede reducirse y crecer dinámicamente según sea necesario.

Sintaxis

template <class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject

Parámetros

TYPE
Parámetro de plantilla que especifica el tipo de objetos almacenados en la matriz. TYPE es un parámetro devuelto por CArray.

ARG_TYPE
Parámetro de plantilla que especifica el tipo de argumento que se usa para tener acceso a los objetos almacenados en la matriz. A menudo una referencia a TYPE. ARG_TYPE es un parámetro que se pasa a CArray.

Miembros

Constructores públicos

Nombre Descripción
CArray::CArray Construye una matriz vacía.

Métodos públicos

Nombre Descripción
CArray::Add Agrega un elemento al final de la matriz; aumenta el tamaño de la matriz si es necesario.
CArray::Append Anexa otra matriz a la matriz; aumenta el tamaño de la matriz si es necesario.
CArray::Copy Copia otra matriz a la matriz; aumenta el tamaño de la matriz si es necesario.
CArray::ElementAt Devuelve una referencia temporal al puntero del elemento dentro de la matriz.
CArray::FreeExtra Libera toda la memoria no usada por encima del límite superior actual.
CArray::GetAt Devuelve el valor en un índice dado.
CArray::GetCount Obtiene el número de elementos de esta matriz.
CArray::GetData Permite el acceso a los elementos de la matriz. Puede ser NULL.
CArray::GetSize Obtiene el número de elementos de esta matriz.
CArray::GetUpperBound Devuelve el índice válido de mayor tamaño.
CArray::InsertAt Inserta un elemento (o todos los elementos de otra matriz) en un índice especificado.
CArray::IsEmpty Determina si la matriz está vacía.
CArray::RemoveAll Quita todos los elementos de esta matriz.
CArray::RemoveAt Quita un elemento en un índice específico.
CArray::SetAt Establece el valor de un índice dado; la matriz no puede aumentar de tamaño.
CArray::SetAtGrow Establece el valor de un índice dado; aumenta el tamaño de la matriz si es necesario.
CArray::SetSize Establece el número de elementos que contendrá esta matriz.

Operadores públicos

Nombre Descripción
operator[] Establece u obtiene el elemento en el índice especificado.

Comentarios

Los índices de matriz siempre comienzan en la posición 0. Puede decidir si corregir el límite superior o permitir que la matriz se expanda al agregar elementos más allá del límite actual. La memoria se asigna de manera contigua al límite superior, incluso si algunos elementos son NULL.

Nota:

La mayoría de los métodos que cambian el tamaño de un objeto CArray o que le agregan elementos usan memcpy_s para mover los elementos. Esto es un problema porque memcpy_s no es compatible con los objetos que requieren que se llame al constructor. Si los elementos de CArray no son compatibles con memcpy_s, debe crear un nuevo objeto CArray del tamaño adecuado. Luego, debe usar CArray::Copy y CArray::SetAt para rellenar la nueva matriz porque esos métodos usan un operador de asignación en lugar de memcpy_s.

Al igual que con una matriz de C, el tiempo de acceso de un elemento indexado CArray es constante y es independiente del tamaño de la matriz.

Sugerencia

Antes de usar una matriz, use SetSize para establecer su tamaño y asignarle memoria. Si no usa SetSize, al agregar elementos a la matriz, esta se reasigna y se copia con frecuencia. La reasignación y copia frecuentes son ineficaces y pueden fragmentar la memoria.

Si se necesita un volcado de elementos individuales en la matriz, debe establecer la profundidad del objeto CDumpContext en 1 o un valor superior.

Algunas funciones miembro de esta clase llaman a funciones auxiliares globales que se deben personalizar en la mayoría de los usos de la clase CArray. Consulte el tema Asistentes de clases de colección en la sección Macros y globales de MFC.

La derivación de clases de matriz es similar a la derivación de lista.

Para más información sobre el uso de CArray, consulte el artículo Colecciones.

Jerarquía de herencia

CObject

CArray

Requisitos

Encabezadoafxtempl.h:

CArray::Add

Agrega un nuevo elemento al final de una matriz, aumentando la matriz en 1.

INT_PTR Add(ARG_TYPE newElement);

Parámetros

ARG_TYPE
Parámetro de plantilla que especifica el tipo de argumentos que hacen referencia a elementos de esta matriz.

newElement
Elemento que se va a agregar a esta matriz.

Valor devuelto

El índice del elemento agregado.

Comentarios

Si SetSize se ha usado con un valor nGrowBy mayor que 1, se puede asignar memoria adicional. Sin embargo, el límite superior aumentará solo en 1.

Ejemplo

// example for CArray::Add
CArray<CPoint, CPoint> ptArray;

CPoint pt(10, 20);
ptArray.Add(pt);             // Element 0
ptArray.Add(CPoint(30, 40)); // Element 1

CArray::Append

Llame a esta función miembro para agregar el contenido de una matriz al final de otra.

INT_PTR Append(const CArray& src);

Parámetros

src
Origen de los elementos que se van a anexar a una matriz.

Valor devuelto

Índice del primer elemento anexado.

Comentarios

Las matrices deben ser del mismo tipo.

Si es necesario, Append puede asignar memoria adicional para acomodar los elementos anexados a la matriz.

Ejemplo

CArray<CPoint, CPoint> myArray1, myArray2;

// Add elements to the second array.
myArray2.Add(CPoint(11, 22));
myArray2.Add(CPoint(12, 42));

// Add elements to the first array and also append the second array.
myArray1.Add(CPoint(1, 2));
myArray1.Append(myArray2);

CArray::CArray

Construye una matriz vacía.

CArray();

Comentarios

La matriz crece un elemento cada vez.

Ejemplo

CArray<CPoint, CPoint> ptArray;

CArray::Copy

Use esta función miembro para copiar los elementos de una matriz en otra.

void Copy(const CArray& src);

Parámetros

src
Origen de los elementos que se vayan a copiar en una matriz.

Comentarios

Llame a esta función miembro para sobrescribir los elementos de una matriz con los elementos de otra.

Copy no libera memoria; sin embargo, si es necesario, Copy puede asignar memoria adicional para dar cabida a los elementos copiados en la matriz.

Ejemplo

CArray<CPoint, CPoint> myArray1, myArray2;

// Add elements to the second array.
myArray2.Add(CPoint(11, 22));
myArray2.Add(CPoint(12, 42));

// Copy the elements from the second array to the first.
myArray1.Copy(myArray2);

CArray::ElementAt

Devuelve una referencia temporal al elemento especificado dentro de la matriz.

TYPE& ElementAt(INT_PTR nIndex);
const TYPE& ElementAt(INT_PTR nIndex) const;

Parámetros

nIndex
Índice entero mayor o igual que 0 y menor o igual que el valor devuelto por GetUpperBound.

Valor devuelto

Referencia a un elemento de matriz.

Comentarios

Se usa para implementar el operador de asignación del lado izquierdo de las matrices.

Ejemplo

Vea el ejemplo de GetSize.

CArray::FreeExtra

Libera memoria adicional que se haya asignado mientras crecía la matriz.

void FreeExtra();

Comentarios

Esta función no tiene ningún efecto sobre el tamaño o el límite superior de la matriz.

Ejemplo

Vea el ejemplo de GetData.

CArray::GetAt

Devuelve el elemento de matriz que se encuentra en el índice especificado.

TYPE& GetAt(INT_PTR nIndex);
const TYPE& GetAt(INT_PTR nIndex) const;

Parámetros

TYPE
Parámetro de plantilla que especifica el tipo de los elementos de matriz.

nIndex
Índice entero mayor o igual que 0 y menor o igual que el valor devuelto por GetUpperBound.

Valor devuelto

Elemento de matriz que se encuentra actualmente en este índice.

Comentarios

Si se pasa un valor negativo o un valor mayor que el valor devuelto por GetUpperBound, se producirá un error en la aserción.

Ejemplo

CArray<CPoint, CPoint> myArray;
CPoint pt;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

// Modify all the points in the array.
for (int i = 0; i <= myArray.GetUpperBound(); i++)
{
   pt = myArray.GetAt(i);
   pt.x = 0;
   myArray.SetAt(i, pt);
}

CArray::GetCount

Devuelve el número de elementos de matriz.

INT_PTR GetCount() const;

Valor devuelto

Número de elementos de la matriz.

Comentarios

Llame a este método para recuperar el número de elementos de la matriz. Dado que los índices se basan en cero, el tamaño es 1 mayor que el índice más grande. Al llamar a este método, se generará el mismo resultado que con el método CArray::GetSize.

Ejemplo

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

// Modify all the points in the array.
for (int i = 0; i < myArray.GetCount(); i++)
{
   CPoint &pt = myArray.ElementAt(i);
   pt.x = 0;
}

CArray::GetData

Use esta función miembro para obtener acceso directo a los elementos de una matriz.

const TYPE* GetData() const;
TYPE* GetData();

Parámetros

TYPE
Parámetro de plantilla que especifica el tipo de los elementos de matriz.

Valor devuelto

Puntero a un elemento de matriz.

Comentarios

Si no hay elementos disponibles, GetData devuelve un valor NULL.

Aunque el acceso directo a los elementos de una matriz puede ayudarle a trabajar más rápidamente, tenga cuidado al llamar a GetData; los errores que cometa afectan directamente a los elementos de la matriz.

Ejemplo

CArray<CPoint, CPoint> myArray;

// Allocate memory for at least 32 elements.
myArray.SetSize(32, 128);

// Add elements to the array.
CPoint *pPt = (CPoint *)myArray.GetData();
for (int i = 0; i < 32; i++, pPt++)
{
   *pPt = CPoint(i, 2 * i);
}

// Only keep first 5 elements and free extra (unused) bytes.
myArray.SetSize(5, 128);
myArray.FreeExtra();

#if _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::GetSize

Devuelve el tamaño de la matriz.

INT_PTR GetSize() const;

Comentarios

Dado que los índices se basan en cero, el tamaño es 1 mayor que el índice más grande. Al llamar a este método, se generará el mismo resultado que con el método CArray::GetCount.

Ejemplo

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

// Modify all the points in the array.
for (int i = 0; i < myArray.GetSize(); i++)
{
   CPoint &pt = myArray.ElementAt(i);
   pt.x = 0;
}

CArray::GetUpperBound

Devuelve el límite superior actual de esta matriz.

INT_PTR GetUpperBound() const;

Comentarios

Dado que los índices de matriz se basan en cero, esta función devuelve un valor 1 menor que GetSize.

La condición GetUpperBound( ) = -1 indica que la matriz no contiene ningún elemento.

Ejemplo

Vea el ejemplo de CArray::GetAt.

CArray::InsertAt

La primera versión de InsertAt inserta un elemento (o varias copias de un elemento) en un índice especificado de una matriz.

void InsertAt(
    INT_PTR nIndex,
    ARG_TYPE newElement,
    INT_PTR nCount = 1);

void InsertAt(
    INT_PTR nStartIndex,
    CArray* pNewArray);

Parámetros

nIndex
Índice entero que puede ser mayor que el valor devuelto por GetUpperBound.

ARG_TYPE
Parámetro de plantilla que especifica el tipo de elementos de esta matriz.

newElement
Elemento que se va a colocar en esta matriz.

nCount
Número de veces que se debe insertar este elemento (el valor predeterminado es 1).

nStartIndex
Índice entero que puede ser mayor que el valor devuelto por GetUpperBound.

pNewArray
Otra matriz que contiene elementos que se van a agregar a esta matriz.

Comentarios

En el proceso, desplaza hacia arriba (incrementando el índice) el elemento existente en este índice y desplaza hacia arriba todos los elementos por encima de él.

La segunda versión inserta todos los elementos de otra colección CArray, empezando por la posición nStartIndex.

La función SetAt, en cambio, reemplaza un elemento de matriz especificado y no desplaza ningún elemento.

Ejemplo

// example for CArray::InsertAt

CArray<CPoint, CPoint> ptArray;

ptArray.Add(CPoint(10, 20));         // Element 0
ptArray.Add(CPoint(30, 40));         // Element 1 (will become element 2)
ptArray.InsertAt(1, CPoint(50, 60)); // New element 1

CArray::IsEmpty

Determina si la matriz está vacía.

BOOL IsEmpty() const;

Valor devuelto

Distinto de cero si la matriz no contiene elementos; de lo contrario, 0.

CArray::operator []

Estos operadores de subíndice son un buen sustituto de las funciones SetAt y GetAt.

TYPE& operator[](int_ptr nindex);
const TYPE& operator[](int_ptr nindex) const;

Parámetros

TYPE
Parámetro de plantilla que especifica el tipo de elementos de esta matriz.

nIndex
Índice del elemento al que se tendrá acceso.

Comentarios

El primer operador, llamado para las matrices que no son const, se puede usar a la derecha (r-value) o a la izquierda (l-value) de una instrucción de asignación. El segundo, llamado para las matrices const, solo se puede usar a la derecha.

La versión de depuración de la biblioteca afirma si el subíndice (ya sea en el lado izquierdo o derecho de una instrucción de asignación) está fuera de los límites.

Ejemplo

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

// Modify all the points in the array.
for (int i = 0; i <= myArray.GetUpperBound(); i++)
{
   myArray[i].x = 0;
}

CArray::RelocateElements

Reubica los datos en un nuevo búfer cuando la matriz debe crecer o reducirse.

template<class TYPE, class ARG_TYPE>
AFX_INLINE void CArray<TYPE, ARG_TYPE>::RelocateElements(
    TYPE* pNewData,
    const TYPE* pData,
    INT_PTR nCount);

Parámetros

pNewData
Nuevo búfer para la matriz de elementos.

pData
Matriz antigua de elementos.

nCount
Cantidad de elementos de la matriz antigua.

Comentarios

pNewData es siempre lo bastante grande como para contener todos los elementos pData.

La implementación CArray usa este método para copiar los datos antiguos en un nuevo búfer cuando la matriz debe crecer o reducirse (cuando se llama a SetSize o FreeExtra). La implementación predeterminada simplemente copia los datos.

Para las matrices en las que un elemento contiene un puntero a uno de sus propios miembros, u otra estructura contiene un puntero a uno de los elementos de la matriz, los punteros no se actualizan en la copia sin formato. En este caso, puede corregir punteros mediante la implementación de una especialización de RelocateElements con los tipos pertinentes. Usted también es responsable de la copia de datos.

CArray::RemoveAll

Quita todos los elementos de esta matriz.

void RemoveAll();

Comentarios

Si la matriz ya está vacía, la función sigue funcionando.

Ejemplo

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

myArray.RemoveAll();

#ifdef _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::RemoveAt

Quita uno o varios elementos que comienzan en un índice especificado de una matriz.

void RemoveAt(
    INT_PTR nIndex,
    INT_PTR nCount = 1);

Parámetros

nIndex
Índice entero mayor o igual que 0 y menor o igual que el valor devuelto por GetUpperBound.

nCount
Número de elementos que se va a quitar.

Comentarios

En el proceso, desplaza hacia abajo todos los elementos situados encima de los elementos quitados. Disminuye el límite superior de la matriz, pero no libera memoria.

Si intenta quitar más elementos de los contenidos en la matriz por encima del punto de eliminación, se produce una aserción en la versión de depuración de la biblioteca.

Ejemplo

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

myArray.RemoveAt(5);

#ifdef _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::SetAt

Establece el elemento de matriz en el índice especificado.

void SetAt(INT_PTR nIndex, ARG_TYPE newElement);

Parámetros

nIndex
Índice entero mayor o igual que 0 y menor o igual que el valor devuelto por GetUpperBound.

ARG_TYPE
Parámetro de plantilla que especifica el tipo de argumentos que se usan para hacer referencia a los elementos de una matriz.

newElement
Nuevo valor de elemento que se va a almacenar en la posición especificada.

Comentarios

SetAt no hará que la matriz crezca. Use SetAtGrow si quiere que la matriz crezca automáticamente.

Debe asegurarse de que el valor de índice represente una posición válida en la matriz. Si está fuera de los límites, se realiza una aserción en la versión de depuración de la biblioteca.

Ejemplo

Vea el ejemplo de GetAt.

CArray::SetAtGrow

Establece el elemento de matriz en el índice especificado.

void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);

Parámetros

nIndex
Índice entero mayor o igual que 0.

ARG_TYPE
Parámetro de plantilla que especifica el tipo elementos de la matriz.

newElement
Elemento que se va a agregar a esta matriz. Se permite un valor NULL.

Comentarios

La matriz crece automáticamente si es necesario (es decir, el límite superior se ajusta para acomodar el nuevo elemento).

Ejemplo

// example for CArray::SetAtGrow
CArray<CPoint, CPoint> ptArray;

ptArray.Add(CPoint(10, 20)); // Element 0
ptArray.Add(CPoint(30, 40)); // Element 1
// Element 2 deliberately skipped
ptArray.SetAtGrow(3, CPoint(50, 60)); // Element 3

CArray::SetSize

Establece el tamaño de una matriz vacía o existente; asigna memoria si es necesario.

void SetSize(
    INT_PTR nNewSize,
    INT_PTR nGrowBy = -1);

Parámetros

nNewSize
Nuevo tamaño de matriz (número de elementos). Debe ser mayor o igual que 0.

nGrowBy
Número mínimo de ranuras de elemento que se van a asignar si es necesario un aumento de tamaño.

Comentarios

Si el nuevo tamaño es menor que el tamaño anterior, la matriz se trunca y se libera toda la memoria no utilizada.

Use esta función para establecer el tamaño de la matriz antes de empezar a usar la matriz. Si no usa SetSize, al agregar elementos a la matriz, esta se reasigna y se copia con frecuencia. La reasignación y copia frecuentes son ineficaces y pueden fragmentar la memoria.

El parámetro nGrowBy afecta a la asignación de memoria interna mientras la matriz crece. Su uso nunca afecta al tamaño de la matriz según lo notificado por GetSize y GetUpperBound. Si se usa el valor predeterminado, MFC asigna memoria de una manera calculada para evitar la fragmentación de memoria y optimizar la eficiencia en la mayoría de los casos.

Ejemplo

Vea el ejemplo de GetData.

Consulte también

Ejemplo de MFCCOLLECT
CObject (clase)
Gráfico de jerarquías
CObArray (clase)
Asistentes de clase de colección