CAtlArray Class
The latest version of this topic can be found at CAtlArray Class.
This class implements an array object.
Syntax
template<typename E, class ETraits = CElementTraits<E>>
class CAtlArray
Parameters
E
The type of data to be stored in the array.
ETraits
The code used to copy or move elements.
Members
Methods
Add | Call this method to add an element to the array object. |
Append | Call this method to add the contents of one array to the end of another. |
AssertValid | Call this method to confirm that the array object is valid. |
CAtlArray | The constructor. |
~CAtlArray | The destructor. |
Copy | Call this method to copy the elements of one array to another. |
FreeExtra | Call this method to remove any empty elements from the array. |
GetAt | Call this method to retrieve a single element from the array object. |
GetCount | Call this method to return the number of elements stored in the array. |
GetData | Call this method to return a pointer to the first element in the array. |
InsertArrayAt | Call this method to insert one array into another. |
InsertAt | Call this method to insert a new element (or multiple copies of an element) into the array object. |
IsEmpty | Call this method to test if the array is empty. |
RemoveAll | Call this method to remove all elements from the array object. |
RemoveAt | Call this method to remove one or more elements from the array. |
SetAt | Call this method to set the value of an element in the array object. |
SetAtGrow | Call this method to set the value of an element in the array object, expanding the array as required. |
SetCount | Call this method to set the size of the array object. |
Operators
operator [] | Call this operator to return a reference to an element in the array. |
Typedefs
INARGTYPE | The data type to use for adding elements to the array. |
OUTARGTYPE | The data type to use for retrieving elements from the array. |
Remarks
CAtlArray provides methods for creating and managing an array of elements of a user-defined type. Although similar to standard C arrays, the CAtlArray object can dynamically shrink and grow as necessary. The array index always starts at position 0, and the upper bound can be fixed, or allowed to expand as new elements are added.
For arrays with a small number of elements, the ATL class CSimpleArray can be used.
CAtlArray is closely related to MFC's CArray class and will work in an MFC project, albeit without serialization support.
For more information, see ATL Collection Classes.
Requirements
Header: atlcoll.h
CAtlArray::Add
Call this method to add an element to the array object.
size_t Add(INARGTYPE element);
size_t Add();
Parameters
element
The element to be added to the array.
Return Value
Returns the index of the added element.
Remarks
The new element is added to the end of the array. If no element is provided, an empty element is added; that is, the array is increased in size as though a real element has been added. If the operation fails, AtlThrow is called with the argument E_OUTOFMEMORY.
Example
// Declare an array of integers
CAtlArray<int> iArray;
iArray.Add(1); // element 0
iArray.Add(2); // element 1
iArray.Add(); // element 2
ATLASSERT(iArray.GetCount() == 3);
CAtlArray::Append
Call this method to add the contents of one array to the end of another.
size_t Append(const CAtlArray<E, ETraits>& aSrc);
Parameters
aSrc
The array to append.
Return Value
Returns the index of the first appended element.
Remarks
The elements in the supplied array are added to the end of the existing array. If necessary, memory will be allocated to accommodate the new elements.
The arrays must be of the same type, and it is not possible to append an array to itself.
In debug builds, an ATLASSERT will be raised if the CAtlArray
argument is not a valid array or if aSrc
refers to the same object. In release builds, invalid arguments may lead to unpredictable behavior.
Example
// Declare two integer arrays
CAtlArray<int> iArray1,iArray2;
iArray1.Add(1); // element 0
iArray1.Add(2); // element 1
iArray2.Add(3); // element 0
iArray2.Add(4); // element 1
// Append iArray2 to iArray1
iArray1.Append(iArray2);
ATLASSERT(iArray1.GetCount() == 4);
CAtlArray::AssertValid
Call this method to confirm that the array object is valid.
void AssertValid() const;
Remarks
If the array object is not valid, ATLASSERT
will throw an assertion. This method is available only if _DEBUG is defined.
Example
CAtlArray<float> fArray;
// AssertValid only exists in debug builds
#ifdef _DEBUG
fArray.AssertValid();
#endif
CAtlArray::CAtlArray
The constructor.
CAtlArray() throw();
Remarks
Initializes the array object.
Example
CAtlArray<int> iArray;
CAtlArray::~CAtlArray
The destructor.
~CAtlArray() throw();
Remarks
Frees up any resources used by the array object.
CAtlArray::Copy
Call this method to copy the elements of one array to another.
void Copy(const CAtlArray<E, ETraits>& aSrc);
Parameters
aSrc
The source of the elements to copy to an array.
Remarks
Call this method to overwrite elements of one array with the elements of another array. If necessary, memory will be allocated to accommodate the new elements. It is not possible to copy elements of an array to itself.
If the existing contents of the array are to be retained, use CAtlArray::Append instead.
In debug builds, an ATLASSERT will be raised if the existing CAtlArray
object is not valid, or if aSrc
refers to the same object. In release builds, invalid arguments may lead to unpredictable behavior.
Note
CAtlArray::Copy
does not support arrays consisting of elements created with the CAutoPtr class.
Example
CAtlArray<int> iArrayS, iArrayT;
iArrayS.Add(1);
iArrayS.Add(2);
iArrayT.Add(3);
iArrayT.Add(4);
iArrayT.Copy(iArrayS);
ATLASSERT(iArrayT.GetCount() == 2);
ATLASSERT(iArrayT[0] == 1);
ATLASSERT(iArrayT[1] == 2);
CAtlArray::FreeExtra
Call this method to remove any empty elements from the array.
void FreeExtra() throw();
Remarks
Any empty elements are removed, but the size and upper bound of the array remain unchanged.
In debug builds, an ATLASSERT will be raised if the CAtlArray object is not valid, or if the array would exceed its maximum size.
CAtlArray::GetAt
Call this method to retrieves a single element from the array object.
const E& GetAt(size_t iElement) const throw();
E& GetAt(size_t iElement) throw();
Parameters
iElement
The index value of the array element to return.
Return Value
Returns a reference to the required array element.
Remarks
In debug builds, an ATLASSERT will be raised if iElement
exceeds the number of elements in the array. In release builds, an invalid argument may lead to unpredictable behavior.
Example
// Declare an array of integers
CAtlArray<int> iMyArray;
int element;
// Add ten elements to the array
for (int i = 0; i < 10; i++)
{
iMyArray.Add(i);
}
// Use GetAt and SetAt to modify
// every element in the array
for (size_t i = 0; i < iMyArray.GetCount(); i++)
{
element = iMyArray.GetAt(i);
element *= 10;
iMyArray.SetAt(i, element);
}
CAtlArray::GetCount
Call this method to return the number of elements stored in the array.
size_t GetCount() const throw();
Return Value
Returns the number of elements stored in the array.
Remarks
As the first element in the array is at position 0, the value returned by GetCount
is always 1 greater than the largest index.
Example
See the example for CAtlArray::GetAt.
CAtlArray::GetData
Call this method to return a pointer to the first element in the array.
E* GetData() throw();
const E* GetData() const throw();
Return Value
Returns a pointer to the memory location storing the first element in the array. If no elements are available, NULL is returned.
Example
// Define an array of integers
CAtlArray<int> MyArray;
// Define a pointer
int* pData;
// Allocate enough space for 32 elements
// with buffer increase to be calculated
// automatically
MyArray.SetCount(32, -1);
// Set the pointer to the first element
pData = MyArray.GetData();
// Set array values directly
for (int j = 0; j < 32; j++, pData++)
{
*pData = j * 10;
}
CAtlArray::INARGTYPE
The data type to use for adding elements to the array.
typedef ETraits::INARGTYPE INARGTYPE;
CAtlArray::InsertArrayAt
Call this method to insert one array into another.
void InsertArrayAt(size_t iStart, const CAtlArray<E, ETraits>* paNew);
Parameters
iStart
The index at which the array is to be inserted.
paNew
The array to be inserted.
Remarks
Elements from the array paNew
are copied into the array object, beginning at element iStart
. The existing array elements are moved to avoid being overwritten.
In debug builds, an ATLASSERT will be raised if the CAtlArray
object is not valid, or if the paNew
pointer is NULL or invalid.
Note
CAtlArray::InsertArrayAt
does not support arrays consisting of elements created with the CAutoPtr class.
Example
// Define two integer arrays
CAtlArray<int> iTargetArray, iSourceArray;
// Add elements to first array
for (int x = 0; x < 10; x++)
{
iTargetArray.Add(x);
}
// Add elements to the second array
for (int x = 0; x < 10; x++)
{
iSourceArray.Add(x * 10);
}
// Insert the Source array into the Target
// array, starting at the 5th element.
iTargetArray.InsertArrayAt(5, &iSourceArray);
CAtlArray::InsertAt
Call this method to insert a new element (or multiple copies of an element) into the array object.
void InsertAt(size_t iElement, INARGTYPE element, size_t nCount = 1);
Parameters
iElement
The index where the element or elements are to be inserted.
element
The value of the element or elements to be inserted.
nCount
The number of elements to add.
Remarks
Inserts one or more elements into the array, starting at index iElement
. Existing elements are moved to avoid being overwritten.
In debug builds, an ATLASSERT will be raised if the CAtlArray
object is invalid, the number of elements to be added is zero, or the combined number of elements is too large for the array to contain. In retail builds, passing invalid parameters may cause unpredictable results.
Example
// Declare an array of integers
CAtlArray<int> iBuffer;
// Add elements to the array
for (int b = 0; b < 10; b++)
{
iBuffer.Add(0);
}
// Instert ten 1's into the array
// at position 5
iBuffer.InsertAt(5, 1, 10);
CAtlArray::IsEmpty
Call this method to test if the array is empty.
bool IsEmpty() const throw();
Return Value
Returns true if the array is empty, false otherwise.
Remarks
The array is said to be empty if it contains no elements. Therefore, even if the array contains empty elements, it is not empty.
Example
// Define an array of chars
CAtlArray<char> cArray;
// Add an element
cArray.Add('a');
// Confirm array is not empty
ATLASSERT(!cArray.IsEmpty());
// Remove all elements
cArray.RemoveAll();
// Confirm array is empty
ATLASSERT(cArray.IsEmpty());
CAtlArray::operator []
Call this operator to return a reference to an element in the array.
E& operator[](size_t iElement) throw();
const E& operator[](size_t iElement) const throw();
Parameters
iElement
The index value of the array element to return.
Return Value
Returns a reference to the required array element.
Remarks
Performs a similar function to CAtlArray::GetAt. Unlike the MFC class CArray, this operator cannot be used as a substitute for CAtlArray::SetAt.
In debug builds, an ATLASSERT will be raised if iElement
exceeds the total number of elements in the array. In retail builds, an invalid parameter may cause unpredictable results.
CAtlArray::OUTARGTYPE
The data type to use for retrieving elements from the array.
typedef ETraits::OUTARGTYPE OUTARGTYPE;
CAtlArray::RemoveAll
Call this method to remove all elements from the array object.
void RemoveAll() throw();
Remarks
Removes all of the elements from the array object.
This method calls CAtlArray::SetCount to resize the array and subsequently frees any allocated memory.
Example
See the example for CAtlArray::IsEmpty.
CAtlArray::RemoveAt
Call this method to remove one or more elements from the array.
void RemoveAt(size_t iElement, size_t nCount = 1);
Parameters
iElement
The index of the first element to remove.
nCount
The number of elements to remove.
Remarks
Removes one or more elements from the array. Any remaining elements are shifted down. The upper bound is decremented, but memory is not freed until a call to CAtlArray::FreeExtra is made.
In debug builds, an ATLASSERT will be raised if the CAtlArray
object is not valid, or if the combined total of iElement
and nCount
exceeds the total number of elements in the array. In retail builds, invalid parameters may cause unpredictable results.
Example
// Declare an array of chars
CAtlArray<char> cMyArray;
// Add ten elements to the array
for (int a = 0; a < 10; a++)
{
cMyArray.Add('*');
}
// Remove five elements starting with
// the element at position 1
cMyArray.RemoveAt(1, 5);
// Free memory
cMyArray.FreeExtra();
// Confirm size of array
ATLASSERT(cMyArray.GetCount() == 5);
CAtlArray::SetAt
Call this method to set the value of an element in the array object.
void SetAt(size_t iElement, INARGTYPE element);
Parameters
iElement
The index pointing to the array element to set.
element
The new value of the specified element.
Remarks
In debug builds, an ATLASSERT will be raised if iElement
exceeds the number of elements in the array. In retail builds, an invalid parameter may result in unpredictable results.
Example
See the example for CAtlArray::GetAt.
CAtlArray::SetCount
Call this method to set the size of the array object.
bool SetCount(size_t nNewSize, int nGrowBy = - 1);
Parameters
nNewSize
The required size of the array.
nGrowBy
A value used to determine how large to make the buffer. A value of -1 causes an internally calculated value to be used.
Return Value
Returns true if the array is successfully resized, false otherwise.
Remarks
The array can be increased or decreased in size. If increased, extra empty elements are added to the array. If decreased, the elements with the largest indices will be deleted and memory freed.
Use this method to set the size of the array before using it. If SetCount
is not used, the process of adding elements — and the subsequent memory allocation performed — will reduce performance and fragment memory.
Example
See the example for CAtlArray::GetData.
CAtlArray::SetAtGrow
Call this method to set the value of an element in the array object, expanding the array as required.
void SetAtGrow(size_t iElement, INARGTYPE element);
Parameters
iElement
The index pointing to the array element to set.
element
The new value of the specified element.
Remarks
Replaces the value of the element pointed to by the index. If iElement
is larger than the current size of the array, the array is automatically increased using a call to CAtlArray::SetCount. In debug builds, an ATLASSERT will be raised if the CAtlArray
object is not valid. In retail builds, invalid parameters may cause unpredictable results.
Example
// Declare an array of integers
CAtlArray<int> iGrowArray;
// Add an element
iGrowArray.Add(0);
// Add an extra element at position 19.
// This will grow the array to accommodate.
iGrowArray.SetAtGrow(19, 0);
// Confirm size of new array
ATLASSERT(iGrowArray.GetCount() == 20);
// Note: the values at position 1 to 18
// are undefined.
See Also
MMXSwarm Sample
DynamicConsumer Sample
UpdatePV Sample
Marquee Sample
CArray Class
Class Overview