Поделиться через


Класс CAtlArray

Этот класс реализует объект массива.

Синтаксис

template<typename E, class ETraits = CElementTraits<E>>
class CAtlArray

Параметры

E
Тип данных для сохранения в массиве.

ETraits
Код, используемый для копирования или перемещения элементов.

Участники

Методы

Function Description
Прибавить Вызовите этот метод, чтобы добавить элемент в объект массива.
Добавить Вызовите этот метод, чтобы добавить содержимое одного массива в конец другого.
AssertValid Вызовите этот метод, чтобы убедиться, что объект массива действителен.
CAtlArray Конструктор.
~CAtlArray Деструктор
Копировать Вызовите этот метод, чтобы скопировать элементы одного массива в другой.
FreeExtra Вызовите этот метод, чтобы удалить все пустые элементы из массива.
GetAt Вызовите этот метод, чтобы получить один элемент из объекта массива.
GetCount Вызовите этот метод, чтобы вернуть количество элементов, хранящихся в массиве.
GetData Вызовите этот метод, чтобы вернуть указатель на первый элемент в массиве.
InsertArrayAt Вызовите этот метод, чтобы вставить один массив в другой.
InsertAt Вызовите этот метод, чтобы вставить новый элемент (или несколько копий элемента) в объект массива.
IsEmpty Вызовите этот метод, чтобы проверить, является ли массив пустым.
RemoveAll Вызовите этот метод, чтобы удалить все элементы из объекта массива.
RemoveAt Вызовите этот метод, чтобы удалить один или несколько элементов из массива.
SetAt Вызовите этот метод, чтобы задать значение элемента в объекте массива.
SetAtGrow Вызовите этот метод, чтобы задать значение элемента в объекте массива, расширяя массив по мере необходимости.
SetCount Вызовите этот метод, чтобы задать размер объекта массива.

Операторы

Operator Description
operator [] Вызовите этот оператор, чтобы вернуть ссылку на элемент в массиве.

Определения типов

Typedef Description
INARGTYPE Тип данных, используемый для добавления элементов в массив.
OUTARGTYPE Тип данных, используемый для извлечения элементов из массива.

Замечания

CAtlArray предоставляет методы для создания массива элементов определяемого пользователем типа и управления ими. Несмотря на то, что он похож на стандартные массивы C, CAtlArray объект может динамически сжиматься и увеличиваться по мере необходимости. Индекс массива всегда начинается с позиции 0, а верхняя граница может быть исправлена или разрешена для расширения при добавлении новых элементов.

Для массивов с небольшим количеством элементов можно использовать класс ATL CSimpleArray .

CAtlArray тесно связан с классом MFC и будет работать в проекте MFC CArray , хотя и без поддержки сериализации.

Дополнительные сведения см. в разделе "Классы коллекций ATL".

Требования

Заголовок: atlcoll.h

CAtlArray::Add

Вызовите этот метод, чтобы добавить элемент в объект массива.

size_t Add(INARGTYPE element);
size_t Add();

Параметры

элемент
Элемент, добавляемый в массив.

Возвращаемое значение

Возвращает индекс добавленного элемента.

Замечания

Новый элемент добавляется в конец массива. Если элемент не указан, добавляется пустой элемент; То есть массив увеличивается в размере, как если бы был добавлен реальный элемент. Если операция завершается ошибкой, AtlThrow вызывается с аргументом E_OUTOFMEMORY.

Пример

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

Вызовите этот метод, чтобы добавить содержимое одного массива в конец другого.

size_t Append(const CAtlArray<E, ETraits>& aSrc);

Параметры

aSrc
Массив для добавления.

Возвращаемое значение

Возвращает индекс первого добавленного элемента.

Замечания

Элементы в предоставленном массиве добавляются в конец существующего массива. При необходимости память будет выделена для размещения новых элементов.

Массивы должны иметь один и тот же тип, и невозможно добавить к себе массив.

В отладочных сборках будет вызываться ATLASSERT, если CAtlArray аргумент не является допустимым массивом или если aSrc ссылается на тот же объект. В сборках выпуска недопустимые аргументы могут привести к непредсказуемому поведению.

Пример

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

Вызовите этот метод, чтобы убедиться, что объект массива действителен.

void AssertValid() const;

Замечания

Если объект массива недопустим, ATLASSERT вызовет утверждение. Этот метод доступен только в том случае, если определен _DEBUG.

Пример

CAtlArray<float> fArray;
// AssertValid only exists in debug builds
#ifdef _DEBUG
fArray.AssertValid();   
#endif

CAtlArray::CAtlArray

Конструктор.

CAtlArray() throw();

Замечания

Инициализирует объект массива.

Пример

CAtlArray<int> iArray;   

CAtlArray::~CAtlArray

Деструктор

~CAtlArray() throw();

Замечания

Освобождает все ресурсы, используемые объектом массива.

CAtlArray::Copy

Вызовите этот метод, чтобы скопировать элементы одного массива в другой.

void Copy(const CAtlArray<E, ETraits>& aSrc);

Параметры

aSrc
Источник элементов для копирования в массив.

Замечания

Вызовите этот метод для перезаписи элементов одного массива элементами другого массива. При необходимости память будет выделена для размещения новых элементов. Невозможно скопировать элементы массива в себя.

Если необходимо сохранить существующее содержимое массива, используйте CAtlArray::Append .

В отладочных сборках будет вызываться ATLASSERT, если существующий CAtlArray объект недействителен, или если aSrc ссылается на тот же объект. В сборках выпуска недопустимые аргументы могут привести к непредсказуемому поведению.

Примечание.

CAtlArray::Copy не поддерживает массивы, состоящие из элементов, созданных с помощью класса CAutoPtr .

Пример

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

Вызовите этот метод, чтобы удалить все пустые элементы из массива.

void FreeExtra() throw();

Замечания

Все пустые элементы удаляются, но размер и верхняя граница массива остаются неизменными.

В отладочных сборках объект ATLASSERT будет вызываться, если объект CAtlArray недопустим или если массив превысит его максимальный размер.

CAtlArray::GetAt

Вызовите этот метод, чтобы получить один элемент из объекта массива.

const E& GetAt(size_t iElement) const throw();
E& GetAt(size_t iElement) throw();

Параметры

iElement
Значение индекса возвращаемого элемента массива.

Возвращаемое значение

Возвращает ссылку на обязательный элемент массива.

Замечания

В отладочных сборках объект ATLASSERT будет вызван, если iElement превышает количество элементов в массиве. В сборках выпуска недопустимый аргумент может привести к непредсказуемому поведению.

Пример

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

Вызовите этот метод, чтобы вернуть количество элементов, хранящихся в массиве.

size_t GetCount() const throw();

Возвращаемое значение

Возвращает количество элементов, хранящихся в массиве.

Замечания

Так как первый элемент в массиве находится в позиции 0, возвращаемое GetCount значением всегда равно 1 больше, чем самый большой индекс.

Пример

См. пример CAtlArray ::GetAt.

CAtlArray::GetData

Вызовите этот метод, чтобы вернуть указатель на первый элемент в массиве.

E* GetData() throw();
const E* GetData() const throw();

Возвращаемое значение

Возвращает указатель на расположение памяти, в котором хранится первый элемент в массиве. Если элементы недоступны, возвращается значение NULL.

Пример

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

Тип данных, используемый для добавления элементов в массив.

typedef ETraits::INARGTYPE INARGTYPE;

CAtlArray::InsertArrayAt

Вызовите этот метод, чтобы вставить один массив в другой.

void InsertArrayAt(size_t iStart, const CAtlArray<E, ETraits>* paNew);

Параметры

iStart
Индекс, по которому должен быть вставлен массив.

paNew
Массив, который нужно вставить.

Замечания

Элементы из массива paNew копируются в объект массива, начиная с элемента iStart. Существующие элементы массива перемещаются, чтобы избежать перезаписи.

В отладочных сборках объект ATLASSERT будет вызван, если CAtlArray объект недопустим, или если указатель paNew имеет значение NULL или недопустимый.

Примечание.

CAtlArray::InsertArrayAt не поддерживает массивы, состоящие из элементов, созданных с помощью класса CAutoPtr .

Пример

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

Вызовите этот метод, чтобы вставить новый элемент (или несколько копий элемента) в объект массива.

void InsertAt(size_t iElement, INARGTYPE element, size_t nCount = 1);

Параметры

iElement
Индекс, в который необходимо вставить элемент или элементы.

элемент
Значение вставленного элемента или элементов.

nCount
Количество добавляемых элементов.

Замечания

Вставляет один или несколько элементов в массив, начиная с индекса iElement. Существующие элементы перемещаются, чтобы избежать перезаписи.

В отладочных сборках объект ATLASSERT будет вызываться, если CAtlArray объект недопустим, число добавляемых элементов равно нулю, или объединенное число элементов слишком велико для содержащегося массива. В розничных сборках передача недопустимых параметров может привести к непредсказуемым результатам.

Пример

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

Вызовите этот метод, чтобы проверить, является ли массив пустым.

bool IsEmpty() const throw();

Возвращаемое значение

Возвращает значение true, если массив пуст, значение false в противном случае.

Замечания

Массив считается пустым, если он не содержит элементов. Таким образом, даже если массив содержит пустые элементы, он не пуст.

Пример

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

Вызовите этот оператор, чтобы вернуть ссылку на элемент в массиве.

E& operator[](size_t ielement) throw();
const E& operator[](size_t ielement) const throw();

Параметры

iElement
Значение индекса возвращаемого элемента массива.

Возвращаемое значение

Возвращает ссылку на обязательный элемент массива.

Замечания

Выполняет аналогичную функцию CAtlArray::GetAt. В отличие от класса CArray класса MFC, этот оператор нельзя использовать в качестве замены CAtlArray::SetAt.

В отладочных сборках значение ATLASSERT будет возникать, если iElement превышает общее количество элементов в массиве. В розничных сборках недопустимый параметр может привести к непредсказуемым результатам.

CAtlArray::OUTARGTYPE

Тип данных, используемый для извлечения элементов из массива.

typedef ETraits::OUTARGTYPE OUTARGTYPE;

CAtlArray::RemoveAll

Вызовите этот метод, чтобы удалить все элементы из объекта массива.

void RemoveAll() throw();

Замечания

Удаляет все элементы из объекта массива.

Этот метод вызывает CAtlArray::SetCount для изменения размера массива и впоследствии освобождает любую выделенную память.

Пример

См. пример CAtlArray ::IsEmpty.

CAtlArray::RemoveAt

Вызовите этот метод, чтобы удалить один или несколько элементов из массива.

void RemoveAt(size_t iElement, size_t nCount = 1);

Параметры

iElement
Индекс первого элемента, который нужно удалить.

nCount
Число удаляемых элементов.

Замечания

Удаляет один или несколько элементов из массива. Все остальные элементы перемещаются вниз. Верхняя граница уменьшается, но память не освобождается до вызова CAtlArray::FreeExtra .

В отладочных сборках объект ATLASSERT будет вызван, если CAtlArray объект недействителен, или если совокупное общее количество элементов iElement и nCount превышает общее количество элементов в массиве. В розничных сборках недопустимые параметры могут привести к непредсказуемым результатам.

Пример

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

Вызовите этот метод, чтобы задать значение элемента в объекте массива.

void SetAt(size_t iElement, INARGTYPE element);

Параметры

iElement
Индекс, указывающий на заданный элемент массива.

элемент
Новое значение указанного элемента.

Замечания

В отладочных сборках объект ATLASSERT будет вызван, если iElement превышает количество элементов в массиве. В розничных сборках недопустимый параметр может привести к непредсказуемым результатам.

Пример

См. пример CAtlArray ::GetAt.

CAtlArray::SetCount

Вызовите этот метод, чтобы задать размер объекта массива.

bool SetCount(size_t nNewSize, int nGrowBy = - 1);

Параметры

nNewSize
Требуемый размер массива.

nGrowBy
Значение, используемое для определения размера буфера. Значение -1 приводит к использованию внутреннего вычисляемого значения.

Возвращаемое значение

Возвращает значение true, если массив успешно изменен, значение false в противном случае.

Замечания

Массив может быть увеличен или уменьшен в размерах. При увеличении в массив добавляются дополнительные пустые элементы. При снижении элементы с наибольшими индексами будут удалены и освобождены память.

Используйте этот метод, чтобы задать размер массива перед его использованием. Если SetCount он не используется, процесс добавления элементов ( и последующее выделение памяти) приведет к снижению производительности и памяти фрагментов.

Пример

См. пример CAtlArray ::GetData.

CAtlArray::SetAtGrow

Вызовите этот метод, чтобы задать значение элемента в объекте массива, расширяя массив по мере необходимости.

void SetAtGrow(size_t iElement, INARGTYPE element);

Параметры

iElement
Индекс, указывающий на заданный элемент массива.

элемент
Новое значение указанного элемента.

Замечания

Заменяет значение элемента, на которое указывает индекс. Если iElement больше текущего размера массива, массив автоматически увеличивается с помощью вызова CAtlArray::SetCount. В отладочных сборках объект ATLASSERT будет вызван, если CAtlArray объект недопустим. В розничных сборках недопустимые параметры могут привести к непредсказуемым результатам.

Пример

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

См. также

Пример MMXSwarm
Пример DynamicConsumer
Пример обновленияPV
Пример marquee
Класс CArray
Общие сведения о классе