Classe CArray
Dá suporte a matrizes semelhantes a matrizes C, mas que podem diminuir e crescer dinamicamente conforme necessário.
Sintaxe
template <class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject
Parâmetros
TYPE
Parâmetro de modelo que especifica o tipo dos objetos armazenados na matriz. TYPE
é um parâmetro retornado por CArray
.
ARG_TYPE
Parâmetro de modelo que especifica o tipo de argumento usado para acessar objetos armazenados na matriz. Frequentemente, uma referência a TYPE
. ARG_TYPE
é um parâmetro passado para CArray
.
Membros
Construtores públicos
Nome | Descrição |
---|---|
CArray::CArray |
Constrói uma matriz vazia. |
Métodos públicos
Nome | Descrição |
---|---|
CArray::Add |
Inclui um elemento ao final da matriz; aumenta a matriz quando necessário. |
CArray::Append |
Acrescenta outra matriz à matriz; aumenta a matriz quando necessário |
CArray::Copy |
Copia outra matriz à matriz; aumenta a matriz quando necessário. |
CArray::ElementAt |
Retorna uma referência temporária ao ponteiro do elemento dentro da matriz. |
CArray::FreeExtra |
Libera toda memória não usada acima do limite superior atual. |
CArray::GetAt |
Retorna o valor a um determinado índice. |
CArray::GetCount |
Obtém o número de elementos nesta matriz. |
CArray::GetData |
Permite acesso aos elementos na matriz. Pode ser NULL . |
CArray::GetSize |
Obtém o número de elementos nesta matriz. |
CArray::GetUpperBound |
Retorna o maior índice válido. |
CArray::InsertAt |
Insere um elemento (ou todos os elementos em outra matriz) em um índice especificado. |
CArray::IsEmpty |
Determina se a matriz está vazia. |
CArray::RemoveAll |
Remove todos os elementos dessa matriz. |
CArray::RemoveAt |
Remove um elemento a um índice específico. |
CArray::SetAt |
Define o valor de um determinado índice; não é permitido à matriz aumentar. |
CArray::SetAtGrow |
Define o valor de um determinado índice; aumenta a matriz quando necessário. |
CArray::SetSize |
Define o número de elementos a ser contido nesta matriz. |
Operadores públicos
Nome | Descrição |
---|---|
operator[] |
Define ou obtém o elemento no índice especificado. |
Comentários
Os índices de matriz sempre começam na posição 0. Você pode decidir se deseja corrigir o limite superior ou permitir que a matriz se expanda quando você adicionar elementos além do limite atual. A memória é alocada contiguamente ao limite superior, mesmo que alguns elementos sejam nulos.
Observação
A maioria dos métodos que redimensionam um objeto CArray
ou adicionam elementos a ele usam memcpy_s
para mover elementos. Isso é um problema porque memcpy_s
não é compatível com nenhum objeto que exige que o construtor seja chamado. Se os itens no CArray
não forem compatíveis com memcpy_s
, você precisará criar um CArray
com o tamanho apropriado. Em seguida, você precisará usar CArray::Copy
e CArray::SetAt
para preencher a nova matriz, pois esses métodos usam um operador de atribuição em vez de memcpy_s
.
Assim como acontece com uma matriz C, o tempo de acesso de um elemento indexado CArray
é constante e é independente do tamanho da matriz.
Dica
Antes de usar uma matriz, utilize SetSize
para estabelecer seu tamanho e alocar memória para ela. Se SetSize
não for utilizado, incluir elementos à matriz fará com que ela seja frequentemente realocada e copiada. Realocações e cópias frequentes são ineficientes e podem fragmentar a memória.
Se você precisar de um despejo de elementos individuais em uma matriz, precisará definir a profundidade do objeto CDumpContext
como 1 ou maior.
Determinadas funções membro dessa classe chamam funções auxiliares globais que precisam ser personalizadas para a maioria dos usos da classe CArray
. Consulte o tópico Auxiliares de classe de coleção na seção sobre Macros e globais do MFC.
A derivação de classe de matriz é semelhante à derivação de lista.
Para obter mais informações sobre como usar CArray
, confira o artigo Coleções.
Hierarquia de herança
CArray
Requisitos
Cabeçalho: afxtempl.h
CArray::Add
Adiciona um novo elemento ao final de uma matriz, aumentando a matriz em 1.
INT_PTR Add(ARG_TYPE newElement);
Parâmetros
ARG_TYPE
Parâmetro de modelo que especifica o tipo dos argumentos que fazem referência a elementos nessa matriz.
newElement
O elemento a ser adicionado a essa matriz.
Valor de retorno
O índice do elemento adicionado.
Comentários
Se SetSize
tiver sido usado com um valor nGrowBy
maior que 1, memória extra poderá ser alocada. No entanto, o limite superior aumentará em apenas 1.
Exemplo
// 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
Chame essa função membro para adicionar o conteúdo de uma matriz ao final de outra.
INT_PTR Append(const CArray& src);
Parâmetros
src
Origem dos elementos a serem acrescentados a uma matriz.
Valor de retorno
O índice do primeiro elemento acrescentado.
Comentários
As matrizes devem ser do mesmo tipo.
Se necessário, Append
poderá alocar memória extra para acomodar os elementos acrescentados à matriz.
Exemplo
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
Constrói uma matriz vazia.
CArray();
Comentários
A matriz expande um elemento de cada vez.
Exemplo
CArray<CPoint, CPoint> ptArray;
CArray::Copy
Use essa função membro para copiar os elementos de uma matriz para outra.
void Copy(const CArray& src);
Parâmetros
src
Origem dos elementos a serem copiados para uma matriz.
Comentários
Chame essa função membro para substituir os elementos de uma matriz pelos de outra matriz.
Copy
não libera memória. No entanto, se necessário, Copy
pode alocar memória extra para acomodar os elementos copiados para a matriz.
Exemplo
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
Retorna uma referência temporária ao elemento especificado dentro da matriz.
TYPE& ElementAt(INT_PTR nIndex);
const TYPE& ElementAt(INT_PTR nIndex) const;
Parâmetros
nIndex
Um índice inteiro maior que ou igual a 0 e menor que ou igual ao valor retornado por GetUpperBound
.
Valor de retorno
Uma referência a um elemento de matriz.
Comentários
É usado para implementar o operador de atribuição do lado esquerdo para matrizes.
Exemplo
Confira o exemplo de GetSize
.
CArray::FreeExtra
Libera qualquer memória extra alocada enquanto a matriz foi expandida.
void FreeExtra();
Comentários
Essa função não tem efeito sobre o tamanho ou o limite superior da matriz.
Exemplo
Confira o exemplo de GetData
.
CArray::GetAt
Retorna o elemento de matriz no índice especificado.
TYPE& GetAt(INT_PTR nIndex);
const TYPE& GetAt(INT_PTR nIndex) const;
Parâmetros
TYPE
Parâmetro de modelo que especifica o tipo dos elementos de matriz.
nIndex
Um índice inteiro maior que ou igual a 0 e menor que ou igual ao valor retornado por GetUpperBound
.
Valor de retorno
O elemento de matriz atualmente neste índice.
Comentários
Passar um valor negativo ou um valor maior do que o valor retornado por GetUpperBound
resultará em uma declaração com falha.
Exemplo
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
Retorna o número de elementos da matriz.
INT_PTR GetCount() const;
Valor de retorno
O número de itens na matriz.
Comentários
Chame esse método para recuperar o número de elementos na matriz. Como os índices são baseados em zero, o tamanho é 1 maior que o maior índice. Chamar esse método gera o mesmo resultado que o do método CArray::GetSize
.
Exemplo
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 essa função membro para obter acesso direto aos elementos em uma matriz.
const TYPE* GetData() const;
TYPE* GetData();
Parâmetros
TYPE
Parâmetro de modelo que especifica o tipo dos elementos de matriz.
Valor de retorno
Um ponteiro para um elemento de matriz.
Comentários
Se nenhum elemento estiver disponível, GetData
retornará um valor nulo.
Embora o acesso direto aos elementos de uma matriz possa ajudar você a trabalhar mais rapidamente, tenha cuidado ao chamar GetData
. Qualquer erro afetará diretamente os elementos da matriz.
Exemplo
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
Retorna o tamanho da matriz.
INT_PTR GetSize() const;
Comentários
Como os índices são baseados em zero, o tamanho é 1 maior que o maior índice. Chamar esse método gera o mesmo resultado que o do método CArray::GetCount
.
Exemplo
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
Retorna o limite superior atual dessa matriz.
INT_PTR GetUpperBound() const;
Comentários
Como os índices de matriz são baseados em zero, essa função retorna um valor 1 menor que GetSize
.
A condição GetUpperBound( )
= -1 indica que a matriz não contém elementos.
Exemplo
Confira o exemplo de CArray::GetAt
.
CArray::InsertAt
A primeira versão de InsertAt
insere um elemento (ou várias cópias de um elemento) em um índice especificado em uma matriz.
void InsertAt(
INT_PTR nIndex,
ARG_TYPE newElement,
INT_PTR nCount = 1);
void InsertAt(
INT_PTR nStartIndex,
CArray* pNewArray);
Parâmetros
nIndex
Um índice inteiro que poderá ser maior que o valor retornado por GetUpperBound
.
ARG_TYPE
Parâmetro de modelo que especifica o tipo dos elementos nessa matriz.
newElement
O elemento a ser colocado na matriz.
nCount
O número de vezes que esse elemento deverá ser inserido (o padrão é 1).
nStartIndex
Um índice inteiro que poderá ser maior que o valor retornado por GetUpperBound
.
pNewArray
Outra matriz que contém elementos a serem adicionados a essa matriz.
Comentários
No processo, ela desloca para cima (incrementando o índice) o elemento existente nesse índice e desloca todos os elementos acima dele.
A segunda versão insere todos os elementos de outra coleção CArray
, começando na posição nStartIndex
.
A função SetAt
, por outro lado, substitui um elemento de matriz especificado e não desloca nenhum elemento.
Exemplo
// 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 se a matriz está vazia.
BOOL IsEmpty() const;
Valor de retorno
Diferente de zero se a matriz contiver elementos; caso contrário, 0.
CArray::operator []
Esses operadores subscritos são substitutos convenientes para as funções SetAt
e GetAt
.
TYPE& operator[](int_ptr nindex);
const TYPE& operator[](int_ptr nindex) const;
Parâmetros
TYPE
Parâmetro de modelo que especifica o tipo dos elementos nessa matriz.
nIndex
Índice do elemento a ser acessado.
Comentários
O primeiro operador, chamado para matrizes que não são const
, pode ser usado à direita (valor-r) ou à esquerda (valor-l) de uma instrução de atribuição. O segundo, chamado para matrizes const
, pode ser usado somente à direita.
A versão de Depuração da biblioteca declarará se o subscrito (no lado esquerdo ou direito de uma instrução de atribuição) estiver fora dos limites.
Exemplo
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
Realoca dados para um novo buffer quando a matriz deve crescer ou diminuir.
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
Um novo buffer para a matriz de elementos.
pData
A antiga matriz de elementos.
nCount
Número de elementos na matriz antiga.
Comentários
pNewData
sempre é grande o suficiente para conter todos os elementos pData
.
A implementação CArray
usa esse método para copiar os dados antigos para um novo buffer quando a matriz deve crescer ou diminuir (quando SetSize
ou FreeExtra
é chamado). A implementação padrão apenas copia os dados.
Para matrizes em que um elemento contém um ponteiro para um dos próprios membros ou em que outra estrutura contém um ponteiro para um dos elementos da matriz, os ponteiros não são atualizados na cópia sem formatação. Nesse caso, você pode corrigir os ponteiros implementando uma especialização de RelocateElements
com os tipos relevantes. Você também é responsável pela cópia de dados.
CArray::RemoveAll
Remove todos os elementos dessa matriz.
void RemoveAll();
Comentários
Se a matriz já estiver vazia, a função ainda funcionará.
Exemplo
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
Remove um ou mais elementos começando em um índice especificado em uma matriz.
void RemoveAt(
INT_PTR nIndex,
INT_PTR nCount = 1);
Parâmetros
nIndex
Um índice inteiro maior que ou igual a 0 e menor que ou igual ao valor retornado por GetUpperBound
.
nCount
O número de elementos a serem removidos.
Comentários
No processo, ele desloca todos os elementos acima dos elementos removidos. Ele diminui o limite superior da matriz, mas não libera memória.
Se você tentar remover mais elementos do que os contidos na matriz acima do ponto de remoção, a versão de depuração da biblioteca será declarada.
Exemplo
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
Define o elemento de matriz no índice especificado.
void SetAt(INT_PTR nIndex, ARG_TYPE newElement);
Parâmetros
nIndex
Um índice inteiro maior que ou igual a 0 e menor que ou igual ao valor retornado por GetUpperBound
.
ARG_TYPE
Parâmetro de modelo que especifica o tipo dos argumentos usados para fazer referência a elementos da matriz.
newElement
O novo valor do elemento a ser armazenado na posição especificada.
Comentários
SetAt
não fará com que a matriz cresça. Use SetAtGrow
se quiser que a matriz cresça automaticamente.
Verifique se o valor do índice representa uma posição válida na matriz. Se estiver fora dos limites, a versão de depuração da biblioteca será declarada.
Exemplo
Confira o exemplo de GetAt
.
CArray::SetAtGrow
Define o elemento de matriz no índice especificado.
void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);
Parâmetros
nIndex
Um índice inteiro que é maior ou igual a 0.
ARG_TYPE
Parâmetro de modelo que especifica o tipo dos elementos na matriz.
newElement
O elemento a ser adicionado a essa matriz. Um valor NULL
é permitido.
Comentários
A matriz crescerá automaticamente, se necessário (ou seja, o limite superior é ajustado para acomodar o novo elemento).
Exemplo
// 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
Estabelece o tamanho de uma matriz vazia ou existente; alocará memória, se necessário.
void SetSize(
INT_PTR nNewSize,
INT_PTR nGrowBy = -1);
Parâmetros
nNewSize
O novo tamanho da matriz (número de elementos). Deve ser maior que ou igual a 0.
nGrowBy
O número mínimo de slots de elemento a serem alocados se um aumento de tamanho for necessário.
Comentários
Se o novo tamanho for menor que o tamanho antigo, a matriz será truncada, e toda a memória não utilizada será liberada.
Use essa função para definir o tamanho da matriz antes de começar a usá-la. Se SetSize
não for utilizado, incluir elementos à matriz fará com que ela seja frequentemente realocada e copiada. Realocações e cópias frequentes são ineficientes e podem fragmentar a memória.
O parâmetro nGrowBy
afeta a alocação de memória interna enquanto a matriz está crescendo. Seu uso nunca afeta o tamanho da matriz conforme relatado por GetSize
e GetUpperBound
. Se o valor padrão for usado, o MFC alocará memória de maneira calculada para evitar a fragmentação de memória e otimizar a eficiência para a maioria dos casos.
Exemplo
Confira o exemplo de GetData
.
Confira também
Exemplo de MFC COLLECT
Classe CObject
Gráfico da hierarquia
Classe CObArray
Auxiliares da classe de coleção