CArray
Klasa
Obsługuje tablice, które są podobne do tablic języka C, ale mogą dynamicznie zmniejszać i rozwijać się w razie potrzeby.
Składnia
template <class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject
Parametry
TYPE
Parametr szablonu określający typ obiektów przechowywanych w tablicy. TYPE
jest parametrem zwracanym przez CArray
parametr .
ARG_TYPE
Parametr szablonu określający typ argumentu używany do uzyskiwania dostępu do obiektów przechowywanych w tablicy. Często odwołanie do TYPE
. ARG_TYPE
jest parametrem przekazywanym do CArray
.
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CArray::CArray |
Tworzy pustą tablicę. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CArray::Add |
Dodaje element na końcu tablicy; w razie potrzeby zwiększa tablicę. |
CArray::Append |
Dołącza kolejną tablicę do tablicy; zwiększa tablicę w razie potrzeby |
CArray::Copy |
Kopiuje kolejną tablicę do tablicy; w razie potrzeby zwiększa tablicę. |
CArray::ElementAt |
Zwraca tymczasowe odwołanie do wskaźnika elementu w tablicy. |
CArray::FreeExtra |
Zwalnia całą nieużywaną pamięć powyżej bieżącej górnej granicy. |
CArray::GetAt |
Zwraca wartość dla danego indeksu. |
CArray::GetCount |
Pobiera liczbę elementów w tej tablicy. |
CArray::GetData |
Umożliwia dostęp do elementów w tablicy. Może to być NULL . |
CArray::GetSize |
Pobiera liczbę elementów w tej tablicy. |
CArray::GetUpperBound |
Zwraca największy prawidłowy indeks. |
CArray::InsertAt |
Wstawia element (lub wszystkie elementy w innej tablicy) w określonym indeksie. |
CArray::IsEmpty |
Określa, czy tablica jest pusta. |
CArray::RemoveAll |
Usuwa wszystkie elementy z tej tablicy. |
CArray::RemoveAt |
Usuwa element w określonym indeksie. |
CArray::SetAt |
Ustawia wartość dla danego indeksu; tablica nie może rosnąć. |
CArray::SetAtGrow |
Ustawia wartość dla danego indeksu; w razie potrzeby zwiększa tablicę. |
CArray::SetSize |
Ustawia liczbę elementów, które mają być zawarte w tej tablicy. |
Operatory publiczne
Nazwa/nazwisko | opis |
---|---|
operator[] |
Ustawia lub pobiera element w określonym indeksie. |
Uwagi
Indeksy tablic zawsze zaczynają się od pozycji 0. Możesz zdecydować, czy naprawić górną granicę, czy umożliwić rozwinięcie tablicy podczas dodawania elementów poza bieżącą granicą. Pamięć jest przydzielana stale do górnej granicy, nawet jeśli niektóre elementy mają wartość null.
Uwaga
Większość metod zmiany rozmiaru CArray
obiektu lub dodawania do niego elementów służy memcpy_s
do przenoszenia elementów. Jest to problem, ponieważ memcpy_s
nie jest zgodny z żadnymi obiektami, które wymagają wywołania konstruktora. Jeśli elementy w obiekcie CArray
nie są zgodne z memcpy_s
programem , należy utworzyć nowy CArray
odpowiedni rozmiar. Następnie należy użyć polecenia CArray::Copy
i CArray::SetAt
, aby wypełnić nową tablicę, ponieważ te metody używają operatora przypisania zamiast memcpy_s
.
Podobnie jak w przypadku tablicy C, czas dostępu dla CArray
indeksowanego elementu jest stały i jest niezależny od rozmiaru tablicy.
Napiwek
Przed użyciem tablicy użyj polecenia SetSize
, aby ustanowić jego rozmiar i przydzielić dla niej pamięć. Jeśli nie używasz polecenia SetSize
, dodanie elementów do tablicy powoduje, że jest on często ponownie przydzielany i kopiowany. Częste reallokowanie i kopiowanie są nieefektywne i mogą fragmentować pamięć.
Jeśli potrzebujesz zrzutu poszczególnych elementów w tablicy, musisz ustawić głębokość CDumpContext
obiektu na 1 lub większą.
Niektóre funkcje składowe tej klasy wywołają globalne funkcje pomocnika, które muszą być dostosowane do większości zastosowań CArray
klasy. Zapoznaj się z tematem Collection Class Helpers (Pomocnicy klas kolekcji) w sekcji Makra i globals MFC.
Wyprowadzanie klas tablicy jest podobne do wyprowadzania list.
Aby uzyskać więcej informacji na temat używania programu CArray
, zobacz artykuł Kolekcje.
Hierarchia dziedziczenia
CArray
Wymagania
Nagłówek: afxtempl.h
CArray::Add
Dodaje nowy element na końcu tablicy, zwiększając tablicę o 1.
INT_PTR Add(ARG_TYPE newElement);
Parametry
ARG_TYPE
Parametr szablonu określający typ argumentów odwołujące się do elementów w tej tablicy.
newElement
Element, który ma zostać dodany do tej tablicy.
Wartość zwracana
Indeks dodanego elementu.
Uwagi
Jeśli SetSize
użyto wartości większej niż 1, można przydzielić dodatkową nGrowBy
pamięć. Jednak górna granica zwiększy się o tylko 1.
Przykład
// 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
Wywołaj tę funkcję składową, aby dodać zawartość jednej tablicy na końcu innej.
INT_PTR Append(const CArray& src);
Parametry
src
Źródło elementów do dołączenia do tablicy.
Wartość zwracana
Indeks pierwszego dołączonego elementu.
Uwagi
Tablice muszą być tego samego typu.
W razie potrzeby może przydzielić dodatkową pamięć, Append
aby uwzględnić elementy dołączone do tablicy.
Przykład
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
Tworzy pustą tablicę.
CArray();
Uwagi
Tablica zwiększa jeden element naraz.
Przykład
CArray<CPoint, CPoint> ptArray;
CArray::Copy
Użyj tej funkcji składowej, aby skopiować elementy jednej tablicy do innej.
void Copy(const CArray& src);
Parametry
src
Źródło elementów do skopiowania do tablicy.
Uwagi
Wywołaj tę funkcję składową, aby zastąpić elementy jednej tablicy elementami innej tablicy.
Copy
nie zwalnia pamięci; jednak w razie potrzeby Copy
może przydzielić dodatkową pamięć, aby pomieścić elementy skopiowane do tablicy.
Przykład
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
Zwraca tymczasowe odwołanie do określonego elementu w tablicy.
TYPE& ElementAt(INT_PTR nIndex);
const TYPE& ElementAt(INT_PTR nIndex) const;
Parametry
nIndex
Indeks liczby całkowitej, który jest większy lub równy 0 i mniejszy niż lub równy wartości zwracanej przez GetUpperBound
wartość .
Wartość zwracana
Odwołanie do elementu tablicy.
Uwagi
Służy do implementowania operatora przypisania po lewej stronie dla tablic.
Przykład
Zobacz przykład dla elementu GetSize
.
CArray::FreeExtra
Zwalnia wszelkie dodatkowe pamięci przydzielone podczas powiększania tablicy.
void FreeExtra();
Uwagi
Ta funkcja nie ma wpływu na rozmiar lub górną granicę tablicy.
Przykład
Zobacz przykład dla elementu GetData
.
CArray::GetAt
Zwraca element tablicy w określonym indeksie.
TYPE& GetAt(INT_PTR nIndex);
const TYPE& GetAt(INT_PTR nIndex) const;
Parametry
TYPE
Parametr szablonu określający typ elementów tablicy.
nIndex
Indeks liczby całkowitej, który jest większy lub równy 0 i mniejszy niż lub równy wartości zwracanej przez GetUpperBound
wartość .
Wartość zwracana
Element tablicy obecnie w tym indeksie.
Uwagi
Przekazanie wartości ujemnej lub wartości większej niż wartość zwrócona przez GetUpperBound
spowoduje niepowodzenie asercji.
Przykład
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
Zwraca liczbę elementów tablicy.
INT_PTR GetCount() const;
Wartość zwracana
Liczba elementów w tablicy.
Uwagi
Wywołaj tę metodę, aby pobrać liczbę elementów w tablicy. Ponieważ indeksy są oparte na zera, rozmiar jest 1 większy niż największy indeks. Wywołanie tej metody spowoduje wygenerowanie tego samego wyniku co CArray::GetSize
metoda.
Przykład
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
Użyj tej funkcji składowej, aby uzyskać bezpośredni dostęp do elementów w tablicy.
const TYPE* GetData() const;
TYPE* GetData();
Parametry
TYPE
Parametr szablonu określający typ elementów tablicy.
Wartość zwracana
Wskaźnik do elementu tablicy.
Uwagi
Jeśli żadne elementy nie są dostępne, GetData
zwraca wartość null.
Chociaż bezpośredni dostęp do elementów tablicy może pomóc szybciej pracować, należy zachować ostrożność podczas wywoływania GetData
; wszelkie błędy, które są wykonywane bezpośrednio, wpływają na elementy tablicy.
Przykład
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
Zwraca rozmiar tablicy.
INT_PTR GetSize() const;
Uwagi
Ponieważ indeksy są oparte na zera, rozmiar jest 1 większy niż największy indeks. Wywołanie tej metody spowoduje wygenerowanie tego samego wyniku co CArray::GetCount
metoda.
Przykład
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
Zwraca bieżącą górną granicę tej tablicy.
INT_PTR GetUpperBound() const;
Uwagi
Ponieważ indeksy tablic są oparte na zerach, ta funkcja zwraca wartość 1 mniejszą niż GetSize
.
Warunek GetUpperBound( )
= -1 wskazuje, że tablica nie zawiera żadnych elementów.
Przykład
Zobacz przykład dla elementu CArray::GetAt
.
CArray::InsertAt
Pierwsza wersja InsertAt
wstawia jeden element (lub wiele kopii elementu) w określonym indeksie w tablicy.
void InsertAt(
INT_PTR nIndex,
ARG_TYPE newElement,
INT_PTR nCount = 1);
void InsertAt(
INT_PTR nStartIndex,
CArray* pNewArray);
Parametry
nIndex
Indeks liczby całkowitej, który może być większy niż wartość zwracana przez GetUpperBound
wartość .
ARG_TYPE
Parametr szablonu określający typ elementów w tej tablicy.
newElement
Element, który ma zostać umieszczony w tej tablicy.
nCount
Liczba wstawień tego elementu (wartość domyślna to 1).
nStartIndex
Indeks liczby całkowitej, który może być większy niż wartość zwracana przez GetUpperBound
wartość .
pNewArray
Kolejna tablica zawierająca elementy do dodania do tej tablicy.
Uwagi
W procesie przesuwa się w górę (zwiększając indeks) istniejący element w tym indeksie i przesuwa w górę wszystkie elementy nad nim.
Druga wersja wstawia wszystkie elementy z innej CArray
kolekcji, począwszy od nStartIndex
pozycji.
Natomiast SetAt
funkcja zastępuje jeden określony element tablicy i nie przesuwa żadnych elementów.
Przykład
// 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
Określa, czy tablica jest pusta.
BOOL IsEmpty() const;
Wartość zwracana
Niezerowe, jeśli tablica nie zawiera żadnych elementów; w przeciwnym razie 0.
CArray::operator []
Te operatory indeksu dolnego są wygodnym zamiennikiem SetAt
funkcji i GetAt
.
TYPE& operator[](int_ptr nindex);
const TYPE& operator[](int_ptr nindex) const;
Parametry
TYPE
Parametr szablonu określający typ elementów w tej tablicy.
nIndex
Indeks elementu do uzyskania dostępu.
Uwagi
Pierwszy operator, wywoływany dla tablic, które nie const
są , może być używany po prawej stronie (r-value) lub po lewej (l-wartość) instrukcji przypisania. Drugi, wywoływany dla const
tablic, może być używany tylko po prawej stronie.
Wersja debugowania biblioteki potwierdza, czy indeks dolny (po lewej lub prawej stronie instrukcji przypisania) jest poza granicami.
Przykład
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
Przenosi dane do nowego buforu, gdy tablica powinna rosnąć lub zmniejszać.
template<class TYPE, class ARG_TYPE>
AFX_INLINE void CArray<TYPE, ARG_TYPE>::RelocateElements(
TYPE* pNewData,
const TYPE* pData,
INT_PTR nCount);
Parametry
pNewData
Nowy bufor dla tablicy elementów.
pData
Stara tablica elementów.
nCount
Liczba elementów w starej tablicy.
Uwagi
pNewData
jest zawsze wystarczająco duży, aby przechowywać wszystkie pData
elementy.
Implementacja CArray
używa tej metody, aby skopiować stare dane do nowego buforu, gdy tablica powinna rosnąć lub zmniejszać (gdy SetSize
lub FreeExtra
są wywoływane). Domyślna implementacja po prostu kopiuje dane.
W przypadku tablic, w których element zawiera wskaźnik do jednego z własnych elementów członkowskich, lub inna struktura zawiera wskaźnik do jednego z elementów tablicy, wskaźniki nie są aktualizowane w postaci zwykłego kopiowania. W takim przypadku można poprawić wskaźniki, implementując specjalizację RelocateElements
z odpowiednimi typami. Odpowiadasz również za kopiowanie danych.
CArray::RemoveAll
Usuwa wszystkie elementy z tej tablicy.
void RemoveAll();
Uwagi
Jeśli tablica jest już pusta, funkcja nadal działa.
Przykład
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
Usuwa co najmniej jeden element rozpoczynający się od określonego indeksu w tablicy.
void RemoveAt(
INT_PTR nIndex,
INT_PTR nCount = 1);
Parametry
nIndex
Indeks liczby całkowitej, który jest większy lub równy 0 i mniejszy niż lub równy wartości zwracanej przez GetUpperBound
wartość .
nCount
Liczba elementów do usunięcia.
Uwagi
W procesie przesuwa wszystkie elementy powyżej usuniętych elementów. Spowoduje to obniżenie górnej granicy tablicy, ale nie zwalnia pamięci.
Jeśli spróbujesz usunąć więcej elementów niż znajdują się w tablicy powyżej punktu usuwania, wówczas asercyjna wersja debugowania biblioteki.
Przykład
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
Ustawia element tablicy w określonym indeksie.
void SetAt(INT_PTR nIndex, ARG_TYPE newElement);
Parametry
nIndex
Indeks liczby całkowitej, który jest większy lub równy 0 i mniejszy niż lub równy wartości zwracanej przez GetUpperBound
wartość .
ARG_TYPE
Parametr szablonu określający typ argumentów używanych do odwoływania się do elementów tablicy.
newElement
Nowa wartość elementu, która ma być przechowywana w określonej pozycji.
Uwagi
SetAt
nie spowoduje wzrostu tablicy. Użyj SetAtGrow
polecenia , jeśli chcesz, aby tablica automatycznie rosła.
Należy upewnić się, że wartość indeksu reprezentuje prawidłową pozycję w tablicy. Jeśli jest poza granicami, oznacza to, że wersja debugowania biblioteki jest asercyjna.
Przykład
Zobacz przykład dla elementu GetAt
.
CArray::SetAtGrow
Ustawia element tablicy w określonym indeksie.
void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);
Parametry
nIndex
Indeks liczby całkowitej, który jest większy lub równy 0.
ARG_TYPE
Parametr szablonu określający typ elementów w tablicy.
newElement
Element, który ma zostać dodany do tej tablicy. Dozwolona NULL
jest wartość.
Uwagi
Tablica zwiększa się automatycznie, jeśli jest to konieczne (oznacza to, że górna granica jest dostosowana do nowego elementu).
Przykład
// 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
Określa rozmiar pustej lub istniejącej tablicy; przydziela pamięć w razie potrzeby.
void SetSize(
INT_PTR nNewSize,
INT_PTR nGrowBy = -1);
Parametry
nNewSize
Nowy rozmiar tablicy (liczba elementów). Musi być większe lub równe 0.
nGrowBy
Minimalna liczba miejsc elementów do przydzielenia, jeśli wymagany jest wzrost rozmiaru.
Uwagi
Jeśli nowy rozmiar jest mniejszy niż stary, tablica zostanie obcięta i zostanie zwolniona wszystkie nieużywane pamięci.
Użyj tej funkcji, aby ustawić rozmiar tablicy przed rozpoczęciem korzystania z tablicy. Jeśli nie używasz polecenia SetSize
, dodanie elementów do tablicy powoduje, że jest on często ponownie przydzielany i kopiowany. Częste reallokowanie i kopiowanie są nieefektywne i mogą fragmentować pamięć.
Parametr nGrowBy
wpływa na wewnętrzną alokację pamięci, gdy tablica rośnie. Jego użycie nigdy nie ma wpływu na rozmiar tablicy zgłoszone przez GetSize
i GetUpperBound
. Jeśli jest używana wartość domyślna, MFC przydziela pamięć w sposób obliczony w celu uniknięcia fragmentacji pamięci i optymalizacji wydajności w większości przypadków.
Przykład
Zobacz przykład dla elementu GetData
.
Zobacz też
Przykład MFC COLLECT
CObject
Klasa
Wykres hierarchii
CObArray
Klasa
Pomocnicy klasy kolekcji