La classe CArray
Prend en charge les tableaux qui sont comme des tableaux C, mais peuvent réduire et croître dynamiquement selon les besoins.
Syntaxe
template <class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject
Paramètres
TYPE
Paramètre de modèle qui spécifie le type d’objets stockés dans le tableau. TYPE
est un paramètre retourné par CArray
.
ARG_TYPE
Paramètre de modèle qui spécifie le type d’argument utilisé pour accéder aux objets stockés dans le tableau. Souvent une référence à TYPE
. ARG_TYPE
est un paramètre passé à CArray
.
Membres
Constructeurs publics
Nom | Description |
---|---|
CArray::CArray |
Construit un tableau vide. |
Méthodes publiques
Nom | Description |
---|---|
CArray::Add |
Ajoute un élément à la fin du tableau ; étend le tableau si nécessaire. |
CArray::Append |
Ajoute un autre tableau au tableau ; augmente le tableau si nécessaire |
CArray::Copy |
Copie un autre tableau dans le tableau ; étend le tableau si nécessaire. |
CArray::ElementAt |
Retourne une référence temporaire au pointeur d'élément dans le tableau. |
CArray::FreeExtra |
Libère toute la mémoire inutilisée au-dessus de la limite supérieure actuelle. |
CArray::GetAt |
Retourne la valeur à un index donné. |
CArray::GetCount |
Obtient le nombre d'éléments dans ce tableau. |
CArray::GetData |
Autorise l'accès aux éléments du tableau. Peut être NULL . |
CArray::GetSize |
Obtient le nombre d'éléments dans ce tableau. |
CArray::GetUpperBound |
Retourne le plus grand index valide. |
CArray::InsertAt |
Insère un élément (ou tous les éléments d'un autre tableau) à un index spécifique. |
CArray::IsEmpty |
Détermine si le tableau est vide. |
CArray::RemoveAll |
Supprime tous les éléments de ce tableau. |
CArray::RemoveAt |
Supprime un élément à un index spécifique. |
CArray::SetAt |
Définit la valeur d'un index donné. Le tableau n'est pas autorisé à s'étendre. |
CArray::SetAtGrow |
Définit la valeur d'un index donné. Le tableau est étendu si nécessaire. |
CArray::SetSize |
Définit le nombre d'éléments que ce tableau doit contenir. |
Opérateurs publics
Nom | Description |
---|---|
operator[] |
Définit ou obtient l'élément au niveau de l'index spécifié. |
Notes
Les index de tableau commencent toujours à la position 0. Vous pouvez décider de corriger la limite supérieure ou d’activer le tableau à développer lorsque vous ajoutez des éléments au-delà de la limite actuelle. La mémoire est allouée contiguëment à la limite supérieure, même si certains éléments sont null.
Remarque
La plupart des méthodes qui redimensionnent un CArray
objet ou ajoutent des éléments à son utilisation memcpy_s
pour déplacer des éléments. Il s’agit d’un problème, car memcpy_s
il n’est pas compatible avec les objets qui nécessitent l’appel du constructeur. Si les éléments du fichier CArray
ne sont pas compatibles avec memcpy_s
, vous devez créer une nouvelle CArray
taille appropriée. Vous devez ensuite utiliser CArray::Copy
et CArray::SetAt
remplir le nouveau tableau, car ces méthodes utilisent un opérateur d’affectation au lieu de memcpy_s
.
Comme avec un tableau C, l’heure d’accès d’un CArray
élément indexé est constante et est indépendante de la taille du tableau.
Conseil
Avant d'utiliser un tableau, utilisez SetSize
pour définir sa taille et lui allouer la mémoire nécessaire. Si vous n'utilisez pas SetSize
, l'ajout d'éléments à votre tableau risque d'entraîner de fréquentes opérations de réallocation et de copie de ce dernier. Les opérations fréquentes de réallocation et de copie sont inefficaces et peuvent fragmenter la mémoire.
Si vous avez besoin d’un vidage d’éléments individuels dans un tableau, vous devez définir la profondeur de l’objet CDumpContext
sur 1 ou plus.
Certaines fonctions membres de cette classe appellent des fonctions d’assistance globales qui doivent être personnalisées pour la plupart des utilisations de la CArray
classe. Consultez les helpers de la collection de rubriques dans la section Macros et globals MFC.
La dérivation de classe array est semblable à la dérivation de liste.
Pour plus d’informations sur l’utilisation CArray
, consultez l’article Collections.
Hiérarchie d'héritage
CArray
Spécifications
En-tête : afxtempl.h
CArray::Add
Ajoute un nouvel élément à la fin d’un tableau, augmentant le tableau de 1.
INT_PTR Add(ARG_TYPE newElement);
Paramètres
ARG_TYPE
Paramètre de modèle spécifiant le type d’arguments référençant des éléments dans ce tableau.
newElement
Élément à ajouter à ce tableau.
Valeur de retour
Index de l’élément ajouté.
Notes
Si SetSize
elle a été utilisée avec une nGrowBy
valeur supérieure à 1, une mémoire supplémentaire peut être allouée. Toutefois, la limite supérieure augmente de seulement 1.
Exemple
// 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
Appelez cette fonction membre pour ajouter le contenu d’un tableau à la fin d’une autre.
INT_PTR Append(const CArray& src);
Paramètres
src
Source des éléments à ajouter à un tableau.
Valeur de retour
Index du premier élément ajouté.
Notes
Les tableaux doivent être du même type.
Si nécessaire, Append
peut allouer de la mémoire supplémentaire pour prendre en charge les éléments ajoutés au tableau.
Exemple
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
Construit un tableau vide.
CArray();
Notes
Le tableau augmente un élément à la fois.
Exemple
CArray<CPoint, CPoint> ptArray;
CArray::Copy
Utilisez cette fonction membre pour copier les éléments d’un tableau vers un autre.
void Copy(const CArray& src);
Paramètres
src
Source des éléments à copier dans un tableau.
Notes
Appelez cette fonction membre pour remplacer les éléments d’un tableau avec les éléments d’un autre tableau.
Copy
ne libère pas de mémoire ; Toutefois, si nécessaire, Copy
peut allouer de la mémoire supplémentaire pour prendre en charge les éléments copiés dans le tableau.
Exemple
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
Retourne une référence temporaire à l’élément spécifié dans le tableau.
TYPE& ElementAt(INT_PTR nIndex);
const TYPE& ElementAt(INT_PTR nIndex) const;
Paramètres
nIndex
Index entier supérieur ou égal à 0 et inférieur ou égal à la valeur retournée par GetUpperBound
.
Valeur de retour
Référence à un élément de tableau.
Notes
Il est utilisé pour implémenter l’opérateur d’affectation de gauche pour les tableaux.
Exemple
Consultez l’exemple pour GetSize
.
CArray::FreeExtra
Libère toute mémoire supplémentaire allouée pendant la croissance du tableau.
void FreeExtra();
Notes
Cette fonction n’a aucun effet sur la taille ou la limite supérieure du tableau.
Exemple
Consultez l’exemple pour GetData
.
CArray::GetAt
Retourne l’élément de tableau à l’index spécifié.
TYPE& GetAt(INT_PTR nIndex);
const TYPE& GetAt(INT_PTR nIndex) const;
Paramètres
TYPE
Paramètre de modèle spécifiant le type des éléments de tableau.
nIndex
Index entier supérieur ou égal à 0 et inférieur ou égal à la valeur retournée par GetUpperBound
.
Valeur de retour
Élément de tableau actuellement à cet index.
Notes
Le passage d’une valeur négative ou d’une valeur supérieure à la valeur retournée entraîne GetUpperBound
une assertion ayant échoué.
Exemple
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
Retourne le nombre d’éléments de tableau.
INT_PTR GetCount() const;
Valeur de retour
Nombre d’éléments dans le tableau.
Notes
Appelez cette méthode pour récupérer le nombre d’éléments dans le tableau. Étant donné que les index sont de base zéro, la taille est supérieure à 1 index le plus grand. L’appel de cette méthode génère le même résultat que la CArray::GetSize
méthode.
Exemple
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
Utilisez cette fonction membre pour accéder directement aux éléments d’un tableau.
const TYPE* GetData() const;
TYPE* GetData();
Paramètres
TYPE
Paramètre de modèle spécifiant le type des éléments de tableau.
Valeur de retour
Pointeur vers un élément de tableau.
Notes
Si aucun élément n’est disponible, GetData
retourne une valeur Null.
Bien que l’accès direct aux éléments d’un tableau puisse vous aider à travailler plus rapidement, utilisez la prudence lors de l’appel GetData
; toutes les erreurs que vous effectuez affectent directement les éléments de votre tableau.
Exemple
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
Retourne la taille du tableau.
INT_PTR GetSize() const;
Notes
Étant donné que les index sont de base zéro, la taille est supérieure à 1 index le plus grand. L’appel de cette méthode génère le même résultat que la CArray::GetCount
méthode.
Exemple
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
Retourne la limite supérieure actuelle de ce tableau.
INT_PTR GetUpperBound() const;
Notes
Étant donné que les index de tableau sont de base zéro, cette fonction retourne une valeur inférieure à 1 GetSize
.
La condition GetUpperBound( )
= -1 indique que le tableau ne contient aucun élément.
Exemple
Consultez l’exemple pour CArray::GetAt
.
CArray::InsertAt
La première version d’insère InsertAt
un élément (ou plusieurs copies d’un élément) à un index spécifié dans un tableau.
void InsertAt(
INT_PTR nIndex,
ARG_TYPE newElement,
INT_PTR nCount = 1);
void InsertAt(
INT_PTR nStartIndex,
CArray* pNewArray);
Paramètres
nIndex
Index entier qui peut être supérieur à la valeur retournée par GetUpperBound
.
ARG_TYPE
Paramètre de modèle spécifiant le type d’éléments dans ce tableau.
newElement
Élément à placer dans ce tableau.
nCount
Nombre de fois où cet élément doit être inséré (valeur par défaut : 1).
nStartIndex
Index entier qui peut être supérieur à la valeur retournée par GetUpperBound
.
pNewArray
Autre tableau qui contient des éléments à ajouter à ce tableau.
Notes
Dans le processus, il se déplace vers le haut (en incrémentant l’index) l’élément existant à cet index, et il déplace tous les éléments au-dessus de celui-ci.
La deuxième version insère tous les éléments d’une autre CArray
collection, en commençant à la nStartIndex
position.
La SetAt
fonction, en revanche, remplace un élément de tableau spécifié et ne déplace aucun élément.
Exemple
// 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
Détermine si le tableau est vide.
BOOL IsEmpty() const;
Valeur de retour
Différent de zéro si le tableau ne contient aucun élément ; sinon 0.
CArray::operator []
Ces opérateurs d’indice sont un substitut pratique pour les fonctions et GetAt
les SetAt
fonctions.
TYPE& operator[](int_ptr nindex);
const TYPE& operator[](int_ptr nindex) const;
Paramètres
TYPE
Paramètre de modèle spécifiant le type d’éléments dans ce tableau.
nIndex
Index de l’élément à accéder.
Notes
Le premier opérateur, appelé pour les tableaux qui ne sont pas const
, peut être utilisé à droite (r-value) ou à gauche (l-value) d’une instruction d’affectation. La deuxième, appelée pour const
les tableaux, peut être utilisée uniquement à droite.
La version de débogage de la bibliothèque affirme si l’indice (à gauche ou à droite d’une instruction d’affectation) est hors limites.
Exemple
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
Déplace les données vers une nouvelle mémoire tampon lorsque le tableau doit croître ou réduire.
template<class TYPE, class ARG_TYPE>
AFX_INLINE void CArray<TYPE, ARG_TYPE>::RelocateElements(
TYPE* pNewData,
const TYPE* pData,
INT_PTR nCount);
Paramètres
pNewData
Nouvelle mémoire tampon pour le tableau d’éléments.
pData
Ancien tableau d’éléments.
nCount
Nombre d’éléments dans l’ancien tableau.
Notes
pNewData
est toujours assez grand pour contenir tous les pData
éléments.
L’implémentation CArray
utilise cette méthode pour copier les anciennes données dans une nouvelle mémoire tampon lorsque le tableau doit croître ou réduire (quand SetSize
ou FreeExtra
sont appelés). L’implémentation par défaut copie simplement les données.
Pour les tableaux dans lesquels un élément contient un pointeur vers l’un de ses propres membres, ou une autre structure contient un pointeur vers l’un des éléments de tableau, les pointeurs ne sont pas mis à jour en copie simple. Dans ce cas, vous pouvez corriger les pointeurs en implémentant une spécialisation avec RelocateElements
les types appropriés. Vous êtes également responsable de la copie des données.
CArray::RemoveAll
Supprime tous les éléments de ce tableau.
void RemoveAll();
Notes
Si le tableau est déjà vide, la fonction fonctionne toujours.
Exemple
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
Supprime un ou plusieurs éléments commençant à un index spécifié dans un tableau.
void RemoveAt(
INT_PTR nIndex,
INT_PTR nCount = 1);
Paramètres
nIndex
Index entier supérieur ou égal à 0 et inférieur ou égal à la valeur retournée par GetUpperBound
.
nCount
Nombre d'éléments à supprimer.
Notes
Dans le processus, il déplace tous les éléments au-dessus du ou des éléments supprimés. Il décrémente la limite supérieure du tableau, mais ne libère pas de mémoire.
Si vous essayez de supprimer plus d’éléments que ceux contenus dans le tableau au-dessus du point de suppression, la version de débogage de la bibliothèque affirme.
Exemple
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
Définit l’élément de tableau à l’index spécifié.
void SetAt(INT_PTR nIndex, ARG_TYPE newElement);
Paramètres
nIndex
Index entier supérieur ou égal à 0 et inférieur ou égal à la valeur retournée par GetUpperBound
.
ARG_TYPE
Paramètre de modèle spécifiant le type d’arguments utilisé pour référencer des éléments de tableau.
newElement
Nouvelle valeur d’élément à stocker à la position spécifiée.
Notes
SetAt
ne provoquera pas la croissance du tableau. Utilisez SetAtGrow
si vous souhaitez que le tableau augmente automatiquement.
Vous devez vous assurer que votre valeur d’index représente une position valide dans le tableau. S’il est hors limites, la version de débogage de la bibliothèque affirme.
Exemple
Consultez l’exemple pour GetAt
.
CArray::SetAtGrow
Définit l’élément de tableau à l’index spécifié.
void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);
Paramètres
nIndex
Index entier supérieur ou égal à 0.
ARG_TYPE
Paramètre de modèle spécifiant le type d’éléments dans le tableau.
newElement
Élément à ajouter à ce tableau. Une NULL
valeur est autorisée.
Notes
Le tableau augmente automatiquement si nécessaire (autrement dit, la limite supérieure est ajustée pour prendre en charge le nouvel élément).
Exemple
// 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
Établit la taille d’un tableau vide ou existant ; alloue de la mémoire si nécessaire.
void SetSize(
INT_PTR nNewSize,
INT_PTR nGrowBy = -1);
Paramètres
nNewSize
Nouvelle taille de tableau (nombre d’éléments). Doit être supérieur ou égal à 0.
nGrowBy
Nombre minimal d’emplacements d’élément à allouer si une augmentation de taille est nécessaire.
Notes
Si la nouvelle taille est inférieure à l’ancienne taille, le tableau est tronqué et toutes les mémoires inutilisées sont libérées.
Utilisez cette fonction pour définir la taille de votre tableau avant de commencer à utiliser le tableau. Si vous n'utilisez pas SetSize
, l'ajout d'éléments à votre tableau risque d'entraîner de fréquentes opérations de réallocation et de copie de ce dernier. Les opérations fréquentes de réallocation et de copie sont inefficaces et peuvent fragmenter la mémoire.
Le nGrowBy
paramètre affecte l’allocation de mémoire interne pendant la croissance du tableau. Son utilisation n’affecte jamais la taille du tableau comme indiqué par GetSize
et GetUpperBound
. Si la valeur par défaut est utilisée, MFC alloue de la mémoire d’une manière calculée pour éviter la fragmentation de la mémoire et optimiser l’efficacité pour la plupart des cas.
Exemple
Consultez l’exemple pour GetData
.
Voir aussi
Exemple MFC COLLECT
CObject
Classe
Graphique hiérarchique
CObArray
Classe
Programmes d’assistance pour les classes de collection