Megosztás a következőn keresztül:


CArray osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Támogatja a C tömbhöz hasonló tömböket, de szükség szerint dinamikusan csökkentheti és növelheti a méretet.

Szemantika

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

Paraméterek

TYPE
A tömbben tárolt objektumok típusát meghatározó sablonparaméter. TYPEegy paraméter, amelyet a függvény visszaad.CArray

ARG_TYPE
A tömbben tárolt objektumok eléréséhez használt argumentumtípust meghatározó sablonparaméter. Gyakran hivatkoznak erre TYPE. ARG_TYPEaz a paraméter, amelyet a függvény ad át.CArray

Tagok

Nyilvános konstruktorok

Név Description
CArray::CArray Üres tömböt hoz létre.

Nyilvános metódusok

Név Description
CArray::Add Hozzáad egy elemet a tömb végéhez; szükség esetén növeli a tömböt.
CArray::Append Egy másik tömb hozzáfűzése a tömbhöz; szükség esetén növeli a tömböt
CArray::Copy Másik tömb másolása a tömbbe; szükség esetén növeli a tömböt.
CArray::ElementAt A tömbön belüli elemmutatóra mutató ideiglenes hivatkozást ad vissza.
CArray::FreeExtra Felszabadítja az összes fel nem használt memóriát az aktuális felső határ felett.
CArray::GetAt Egy adott index értékét adja vissza.
CArray::GetCount Lekéri a tömb elemeinek számát.
CArray::GetData Lehetővé teszi a tömb elemeinek elérését. Lehet NULL.
CArray::GetSize Lekéri a tömb elemeinek számát.
CArray::GetUpperBound A legnagyobb érvényes indexet adja vissza.
CArray::InsertAt Egy elemet (vagy egy másik tömb összes elemét) szúr be egy adott indexbe.
CArray::IsEmpty Meghatározza, hogy a tömb üres-e.
CArray::RemoveAll Eltávolítja az összes elemet ebből a tömbből.
CArray::RemoveAt Eltávolít egy elemet egy adott indexből.
CArray::SetAt Egy adott index értékét állítja be; tömb nem növekedhet.
CArray::SetAtGrow Egy adott index értékét állítja be; szükség esetén növeli a tömböt.
CArray::SetSize Beállítja a tömbben található elemek számát.

Nyilvános operátorok

Név Description
operator[] Beállítja vagy lekéri az elemet a megadott indexen.

Megjegyzések

A tömbindexek mindig a 0. pozícióban kezdődnek. Eldöntheti, hogy kijavítja-e a felső határt, vagy engedélyezi a tömb kibontásának engedélyezését, amikor az aktuális kötésen felüli elemeket ad hozzá. A rendszer a memóriát egyrészről a felső határhoz rendeli, még akkor is, ha egyes elemek null értékűek.

Megjegyzés:

A legtöbb metódus, amely átméretez egy CArray objektumot, vagy elemeket ad memcpy_s hozzá az elemek áthelyezéséhez. Ez azért probléma, mert memcpy_s nem kompatibilis olyan objektumokkal, amelyek a konstruktor meghívását igénylik. Ha a benne lévő CArray elemek nem kompatibilisek, memcpy_slétre kell hoznia egy megfelelő méretű újat CArray . Ezután az új tömböt kell használnia CArray::Copy , és CArray::SetAt fel kell töltenie, mert ezek a metódusok hozzárendelési operátort használnak ahelyett, hogy memcpy_s.

A C tömbhöz hasonlóan az indexelt elemek hozzáférési ideje CArray állandó, és független a tömb méretétől.

Jótanács

A tömb használata előtt állítsa SetSize be a méretét, és foglaljon le memóriát. Ha nem használ SetSizeelemeket a tömbhöz, az gyakran újraelosztást és másolást okoz. A gyakori újratelepítés és másolás nem hatékony, és töredezett memóriát okozhat.

Ha egy tömb egyes elemeiből álló memóriaképre van szüksége, az objektum mélységét CDumpContext 1 vagy nagyobbra kell állítania.

Az osztály egyes tagfüggvényei globális segédfüggvényeket hívnak meg, amelyeket az CArray osztály legtöbb használata esetén testre kell szabni. Tekintse meg az MFC Makrók és globálisak szakasz Gyűjteményosztály-segítői című témakörét.

A tömbosztály származtatása olyan, mint a lista származtatása.

A használatról CArraytovábbi információt a Gyűjtemények című cikkben talál.

Öröklési hierarchia

CObject

CArray

Requirements

Fejléc:afxtempl.h

CArray::Add

Új elemet ad hozzá a tömb végéhez, és 1-gyel növeli a tömböt.

INT_PTR Add(ARG_TYPE newElement);

Paraméterek

ARG_TYPE
A tömb elemeire hivatkozó argumentumok típusát meghatározó sablonparaméter.

newElement
A tömbhöz hozzáadandó elem.

Visszaadott érték

A hozzáadott elem indexe.

Megjegyzések

Ha SetSize 1-nél nagyobb értékkel használták nGrowBy , akkor további memória foglalható le. A felső határ azonban csak 1-sel nő.

Example

// 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

Ennek a tagfüggvénynek a meghívásával adja hozzá az egyik tömb tartalmát a másik végéhez.

INT_PTR Append(const CArray& src);

Paraméterek

src
A tömbhöz fűzendő elemek forrása.

Visszaadott érték

Az első hozzáfűzött elem indexe.

Megjegyzések

A tömböknek azonos típusúnak kell lenniük.

Szükség esetén Append további memóriát is lefoglalhat a tömbhöz fűzött elemek elhelyezéséhez.

Example

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

Üres tömböt hoz létre.

CArray();

Megjegyzések

A tömb egyszerre egy elemet növeszt.

Example

CArray<CPoint, CPoint> ptArray;

CArray::Copy

Ezzel a tagfüggvénnyel másolhatja az egyik tömb elemeit egy másikba.

void Copy(const CArray& src);

Paraméterek

src
A tömbbe másolandó elemek forrása.

Megjegyzések

Ennek a tagfüggvénynek a meghívásával felülírhatja az egyik tömb elemeit egy másik tömb elemeivel.

Copy nem szabadít fel memóriát; szükség esetén Copy azonban további memóriát is lefoglalhat a tömbbe másolt elemek elhelyezéséhez.

Example

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

A tömb megadott elemére mutató ideiglenes hivatkozást ad vissza.

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

Paraméterek

nIndex
0-nál nagyobb vagy egyenlő egész számindex, amely kisebb, mint a visszaadott GetUpperBoundérték.

Visszaadott érték

Hivatkozás egy tömbelemre.

Megjegyzések

A tömbök bal oldali hozzárendelési operátorának implementálására szolgál.

Example

Lásd a példát a GetSize.

CArray::FreeExtra

Felszabadítja a tömb termesztése során lefoglalt további memóriát.

void FreeExtra();

Megjegyzések

Ez a függvény nincs hatással a tömb méretére vagy felső határára.

Example

Lásd a példát a GetData.

CArray::GetAt

A megadott index tömbelemét adja vissza.

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

Paraméterek

TYPE
A tömbelemek típusát meghatározó sablonparaméter.

nIndex
0-nál nagyobb vagy egyenlő egész számindex, amely kisebb, mint a visszaadott GetUpperBoundérték.

Visszaadott érték

Az indexben jelenleg található tömbelem.

Megjegyzések

Ha egy negatív vagy a visszaadott értéknél nagyobb értéket ad GetUpperBound át, az hibás állítást eredményez.

Example

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

A tömbelemek számát adja vissza.

INT_PTR GetCount() const;

Visszaadott érték

A tömb elemeinek száma.

Megjegyzések

Hívja meg ezt a metódust a tömb elemeinek számának lekéréséhez. Mivel az indexek nulla alapúak, a méret 1 nagyobb, mint a legnagyobb index. A metódus meghívása ugyanazt az eredményt eredményezi, mint a CArray::GetSize metódus.

Example

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

Ezzel a tagfüggvénysel közvetlen hozzáférést kaphat egy tömb elemeihez.

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

Paraméterek

TYPE
A tömbelemek típusát meghatározó sablonparaméter.

Visszaadott érték

Egy tömbelemre mutató mutató.

Megjegyzések

Ha nincsenek elérhető elemek, GetData null értéket ad vissza.

Bár a tömb elemeihez való közvetlen hozzáférés segíthet a gyorsabb munkában, a híváskor GetDatakörültekintően járjon el; az esetleges hibák közvetlenül befolyásolják a tömb elemeit.

Example

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

A tömb méretét adja vissza.

INT_PTR GetSize() const;

Megjegyzések

Mivel az indexek nulla alapúak, a méret 1 nagyobb, mint a legnagyobb index. A metódus meghívása ugyanazt az eredményt eredményezi, mint a CArray::GetCount metódus.

Example

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

A tömb aktuális felső határát adja vissza.

INT_PTR GetUpperBound() const;

Megjegyzések

Mivel a tömbindexek nulla alapúak, ez a függvény 1-nél GetSizekisebb értéket ad vissza.

A feltétel GetUpperBound( ) = -1 azt jelzi, hogy a tömb nem tartalmaz elemeket.

Example

Lásd a példát a CArray::GetAt.

CArray::InsertAt

Az első verzió InsertAt egy elemet (vagy egy elem több példányát) szúr be egy adott indexbe egy tömbben.

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

void InsertAt(
    INT_PTR nStartIndex,
    CArray* pNewArray);

Paraméterek

nIndex
Egy egész szám index, amely nagyobb lehet, mint a visszaadott GetUpperBoundérték.

ARG_TYPE
A tömb elemeinek típusát meghatározó sablonparaméter.

newElement
A tömbbe helyezendő elem.

nCount
Az elem beszúrásának száma (alapértelmezés szerint 1).

nStartIndex
Egy egész szám index, amely nagyobb lehet, mint a visszaadott GetUpperBoundérték.

pNewArray
Egy másik tömb, amely a tömbhöz hozzáadandó elemeket tartalmazza.

Megjegyzések

A folyamat során felfelé tolódik (az index növelésével) az index meglévő elemét, és felfelé tolja el a fölötte lévő összes elemet.

A második verzió egy másik CArray gyűjtemény összes elemét beszúrja a pozíciótól kezdve nStartIndex .

Ezzel SetAt szemben a függvény egy megadott tömbelemet cserél le, és nem helyez el elemeket.

Example

// 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

Meghatározza, hogy a tömb üres-e.

BOOL IsEmpty() const;

Visszaadott érték

Nonzero, ha a tömb nem tartalmaz elemeket; egyéb esetben 0.

CArray::operator []

Ezek az alsó index-operátorok kényelmesen helyettesítik a függvényeket és GetAt a SetAt függvényeket.

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

Paraméterek

TYPE
A tömb elemeinek típusát meghatározó sablonparaméter.

nIndex
A elérni kívánt elem indexe.

Megjegyzések

A nem consttömbökhöz hívott első operátor a hozzárendelési utasítás jobb oldalán (r-érték) vagy bal oldalán (l-érték) használható. A második tömbökhöz const hívható meg, csak a jobb oldalon használható.

A kódtár hibakeresési verziója azt állítja, hogy az alsó index (a hozzárendelési utasítás bal vagy jobb oldalán) kívül esik-e a korlátokon.

Example

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

Az adatokat áthelyezi egy új pufferbe, amikor a tömbnek növekednie vagy zsugorodnia kell.

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

Paraméterek

pNewData
Az elemek tömbjének új puffere.

pData
Az elemek régi tömbje.

nCount
A régi tömb elemeinek száma.

Megjegyzések

pNewData mindig elég nagy ahhoz, hogy az összes elemet megtartsa pData .

Az CArray implementáció ezzel a módszerrel másolja a régi adatokat egy új pufferbe, amikor a tömbnek növekednie vagy zsugorodnia kell (amikor SetSize vagy FreeExtra amikor meghívják). Az alapértelmezett implementáció csak átmásolja az adatokat.

Az olyan tömbök esetében, amelyekben egy elem mutatót tartalmaz az egyik saját tagjára, vagy egy másik struktúra a tömbelemek egyikére mutató mutatót tartalmaz, a mutatók nem frissülnek egyszerű másolatban. Ebben az esetben a megfelelő típusok specializációjának RelocateElements implementálásával kijavíthatja a mutatókat. Az adatmásolásért is Ön a felelős.

CArray::RemoveAll

Eltávolítja az összes elemet ebből a tömbből.

void RemoveAll();

Megjegyzések

Ha a tömb már üres, a függvény továbbra is működik.

Example

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

Eltávolít egy vagy több elemet egy tömb megadott indexétől kezdve.

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

Paraméterek

nIndex
0-nál nagyobb vagy egyenlő egész számindex, amely kisebb, mint a visszaadott GetUpperBoundérték.

nCount
Az eltávolítandó elemek száma.

Megjegyzések

A folyamat során az eltávolított elem(ek) fölötti összes elem lejjebb kerül. Ez a tömb felső határát korlátozza, de nem szabadít fel memóriát.

Ha több elemet próbál eltávolítani, mint amennyit az eltávolítási pont feletti tömb tartalmaz, akkor a kódtár hibakeresési verziója érvényes.

Example

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

Beállítja a tömbelemet a megadott indexen.

void SetAt(INT_PTR nIndex, ARG_TYPE newElement);

Paraméterek

nIndex
0-nál nagyobb vagy egyenlő egész számindex, amely kisebb, mint a visszaadott GetUpperBoundérték.

ARG_TYPE
A tömbelemek hivatkozásához használt argumentumok típusát meghatározó sablonparaméter.

newElement
A megadott helyen tárolandó új elemérték.

Megjegyzések

SetAt a tömb nem fog növekedni. Akkor használja SetAtGrow , ha azt szeretné, hogy a tömb automatikusan növekedjen.

Győződjön meg arról, hogy az index értéke érvényes pozíciót jelöl a tömbben. Ha nincs megkötve, akkor a kódtár hibakeresési verziója érvényes.

Example

Lásd a példát a GetAt.

CArray::SetAtGrow

Beállítja a tömbelemet a megadott indexen.

void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);

Paraméterek

nIndex
0-nál nagyobb vagy egyenlő egész számindex.

ARG_TYPE
A tömb elemeinek típusát meghatározó sablonparaméter.

newElement
A tömbhöz hozzáadandó elem. Egy NULL érték engedélyezett.

Megjegyzések

A tömb szükség esetén automatikusan növekszik (azaz a felső határ az új elem elhelyezésére van beállítva).

Example

// 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

Egy üres vagy meglévő tömb méretét határozza meg; szükség esetén lefoglalja a memóriát.

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

Paraméterek

nNewSize
Az új tömbméret (elemek száma). 0-nál nagyobbnak vagy egyenlőnek kell lennie.

nGrowBy
A lefoglalandó elemhelyek minimális száma, ha méretnövelésre van szükség.

Megjegyzések

Ha az új méret kisebb, mint a régi méret, akkor a tömb csonkolt lesz, és az összes fel nem használt memória felszabadul.

Ezzel a függvénnyel beállíthatja a tömb méretét, mielőtt elkezdené használni a tömböt. Ha nem használ SetSizeelemeket a tömbhöz, az gyakran újraelosztást és másolást okoz. A gyakori újratelepítés és másolás nem hatékony, és töredezett memóriát okozhat.

A nGrowBy paraméter hatással van a belső memóriafoglalásra, amíg a tömb növekszik. Használata soha nem befolyásolja a tömb méretét az GetSize and GetUpperBound. Ha az alapértelmezett értéket használja, az MFC úgy foglalja le a memóriát, hogy elkerülje a memória töredezettségét, és optimalizálja a hatékonyságot a legtöbb esetben.

Example

Lásd a példát a GetData.

Lásd még

MFC-minta COLLECT
CObject osztály
hierarchiadiagram
CObArray osztály
Gyűjteményosztály segítői