Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
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