다음을 통해 공유


CArray 수업

C 배열과 비슷하지만 필요에 따라 동적으로 감소하고 확장할 수 있는 배열을 지원합니다.

구문

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

매개 변수

TYPE
배열에 저장된 개체의 형식을 지정하는 템플릿 매개 변수입니다. TYPE 가 반환 CArray되는 매개 변수입니다.

ARG_TYPE
배열에 저장된 개체에 액세스하는 데 사용되는 인수 형식을 지정하는 템플릿 매개 변수입니다. 종종 에 대한 참조입니다 TYPE. ARG_TYPE 는 에 전달되는 CArray매개 변수입니다.

멤버

공용 생성자

속성 설명
CArray::CArray 빈 배열을 생성합니다.

공용 메서드

이름 설명
CArray::Add 배열 끝에 요소를 추가하고 필요하면 배열을 확장합니다.
CArray::Append 배열에 다른 배열을 추가합니다. 필요한 경우 배열을 증가합니다.
CArray::Copy 배열에 다른 배열을 복사하고 필요하면 배열을 확장합니다.
CArray::ElementAt 배열 내의 요소 포인터에 대한 임시 참조를 반환합니다.
CArray::FreeExtra 현재 상한을 초과하며 사용되지 않는 모든 메모리를 해제합니다.
CArray::GetAt 지정된 인덱스의 값을 반환합니다.
CArray::GetCount 이 배열에 있는 요소의 수를 가져옵니다.
CArray::GetData 배열의 요소에 대한 액세스를 허용합니다. NULL일 수 있습니다.
CArray::GetSize 이 배열에 있는 요소의 수를 가져옵니다.
CArray::GetUpperBound 유효한 최대 인덱스를 반환합니다.
CArray::InsertAt 지정한 인덱스에 요소 하나 또는 다른 배열의 모든 요소를 삽입합니다.
CArray::IsEmpty 배열이 비어 있는지 여부를 확인합니다.
CArray::RemoveAll 이 배열의 모든 요소를 반환합니다.
CArray::RemoveAt 특정 인덱스의 요소를 제거합니다.
CArray::SetAt 지정된 인덱스의 값을 설정합니다. 배열은 확장할 수 없습니다.
CArray::SetAtGrow 지정된 인덱스의 값을 설정합니다. 필요한 경우 배열을 확장합니다.
CArray::SetSize 이 배열에 포함된 요소의 수를 설정합니다.

Public 연산자

속성 설명
operator[] 지정한 인덱스에 있는 요소를 설정하거나 가져옵니다.

설명

배열 인덱스는 항상 위치 0에서 시작합니다. 현재 바인딩된 요소를 추가할 때 상한을 수정할지 아니면 배열을 확장하도록 설정할지 결정할 수 있습니다. 일부 요소가 null인 경우에도 메모리는 상한에 연속적으로 할당됩니다.

참고 항목

개체의 크기를 조정 CArray 하거나 요소를 추가하는 대부분의 메서드는 요소를 이동하는 데 사용합니다 memcpy_s . 생성자를 호출해야 하는 개체와 호환되지 않기 때문에 memcpy_s 문제가 됩니다. 해당 항목과 memcpy_s호환되지 않는 경우 적절한 크기의 새 CArray 항목을 CArray 만들어야 합니다. 그런 다음 새 배열을 사용하고 CArray::Copy CArray::SetAt 채워야 합니다. 이러한 메서드는 대신 대입 연산자를 사용하기 때문입니다 memcpy_s.

C 배열과 마찬가지로 인덱싱된 요소에 대한 CArray 액세스 시간은 상수이며 배열 크기와 독립적입니다.

배열을 사용하기 전에 SetSize를 사용하여 배열 크기를 설정하고 배열에 대해 메모리를 할당합니다. SetSize를 사용하지 않는 경우 배열에 요소를 추가하면 배열이 자주 다시 할당되고 복사됩니다. 이처럼 다시 할당 및 복사가 자주 수행되면 효율성이 떨어지며 메모리가 조각화될 수 있습니다.

배열에 개별 요소의 덤프가 필요한 경우 개체의 CDumpContext 깊이를 1 이상으로 설정해야 합니다.

이 클래스의 특정 멤버 함수는 대부분의 클래스 사용에 맞게 사용자 지정해야 하는 전역 도우미 함수를 CArray 호출합니다. MFC 매크로 및 전역 섹션의 항목 컬렉션 클래스 도우미 를 참조하세요.

배열 클래스 파생은 목록 파생과 같습니다.

사용 CArray방법에 대한 자세한 내용은 컬렉션 문서를 참조하세요.

상속 계층 구조

CObject

CArray

요구 사항

머리글: afxtempl.h

CArray::Add

배열의 끝에 새 요소를 추가하여 배열을 1씩 증가합니다.

INT_PTR Add(ARG_TYPE newElement);

매개 변수

ARG_TYPE
이 배열의 요소를 참조하는 인수의 형식을 지정하는 템플릿 매개 변수입니다.

newElement
이 배열에 추가할 요소입니다.

Return Value

추가된 요소의 인덱스입니다.

설명

SetSize 값이 nGrowBy 1보다 큰 경우 추가 메모리가 할당될 수 있습니다. 그러나 상한은 1씩만 증가합니다.

예시

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

이 멤버 함수를 호출하여 한 배열의 내용을 다른 배열의 끝에 추가합니다.

INT_PTR Append(const CArray& src);

매개 변수

src
배열에 추가할 요소의 원본입니다.

Return Value

추가된 첫 번째 요소의 인덱스입니다.

설명

배열은 동일한 형식이어야 합니다.

필요한 경우 배열에 Append 추가된 요소를 수용하기 위해 추가 메모리를 할당할 수 있습니다.

예시

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

빈 배열을 생성합니다.

CArray();

설명

배열은 한 번에 하나의 요소를 증가합니다.

예시

CArray<CPoint, CPoint> ptArray;

CArray::Copy

이 멤버 함수를 사용하여 한 배열의 요소를 다른 배열에 복사합니다.

void Copy(const CArray& src);

매개 변수

src
배열에 복사할 요소의 원본입니다.

설명

한 배열의 요소를 다른 배열의 요소로 덮어쓰려면 이 멤버 함수를 호출합니다.

Copy 는 메모리를 해제하지 않습니다. 그러나 필요한 경우 배열에 Copy 복사된 요소를 수용하기 위해 추가 메모리를 할당할 수 있습니다.

예시

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

배열 내의 지정된 요소에 대한 임시 참조를 반환합니다.

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

매개 변수

nIndex
0보다 크거나 같고 반환된 값 GetUpperBound보다 작거나 같은 정수 인덱스입니다.

Return Value

배열 요소에 대한 참조입니다.

설명

배열에 대한 왼쪽 할당 연산자를 구현하는 데 사용됩니다.

예시

GetSize에 대한 예를 참조하세요.

CArray::FreeExtra

배열이 커진 동안 할당된 추가 메모리를 해제합니다.

void FreeExtra();

설명

이 함수는 배열의 크기 또는 상한에 영향을 주지 않습니다.

예시

GetData에 대한 예를 참조하세요.

CArray::GetAt

지정된 인덱스에서 배열 요소를 반환합니다.

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

매개 변수

TYPE
배열 요소의 형식을 지정하는 템플릿 매개 변수입니다.

nIndex
0보다 크거나 같고 반환된 값 GetUpperBound보다 작거나 같은 정수 인덱스입니다.

Return Value

현재 이 인덱스에서 배열 요소입니다.

설명

음수 값 또는 반환 GetUpperBound 된 값보다 큰 값을 전달하면 어설션이 실패합니다.

예시

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

배열 요소의 수를 반환합니다.

INT_PTR GetCount() const;

Return Value

배열의 항목 수입니다.

설명

배열의 요소 수를 검색하려면 이 메서드를 호출합니다. 인덱스는 0부터 시작하므로 크기가 가장 큰 인덱스보다 1 더 큽니다. 이 메서드를 호출하면 메서드와 동일한 결과가 CArray::GetSize 생성됩니다.

예시

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

이 멤버 함수를 사용하여 배열의 요소에 직접 액세스할 수 있습니다.

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

매개 변수

TYPE
배열 요소의 형식을 지정하는 템플릿 매개 변수입니다.

Return Value

배열 요소에 대한 포인터입니다.

설명

사용할 수 GetData 있는 요소가 없으면 null 값을 반환합니다.

배열의 요소에 직접 액세스하면 더 빠르게 작업하는 데 도움이 되지만 호출 GetData할 때는 주의해야 합니다. 오류는 배열의 요소에 직접 영향을 줍니다.

예시

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

배열의 크기를 반환합니다.

INT_PTR GetSize() const;

설명

인덱스는 0부터 시작하므로 크기가 가장 큰 인덱스보다 1 더 큽니다. 이 메서드를 호출하면 메서드와 동일한 결과가 CArray::GetCount 생성됩니다.

예시

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

이 배열의 현재 상한을 반환합니다.

INT_PTR GetUpperBound() const;

설명

배열 인덱스는 0부터 시작하므로 이 함수는 1보다 GetSize작은 값을 반환합니다.

조건 GetUpperBound( ) = -1은 배열에 요소가 없음을 나타냅니다.

예시

CArray::GetAt에 대한 예를 참조하세요.

CArray::InsertAt

첫 번째 버전은 배열의 InsertAt 지정된 인덱스에 한 요소(또는 요소의 여러 복사본)를 삽입합니다.

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

void InsertAt(
    INT_PTR nStartIndex,
    CArray* pNewArray);

매개 변수

nIndex
에서 반환 GetUpperBound한 값보다 클 수 있는 정수 인덱스입니다.

ARG_TYPE
이 배열의 요소 형식을 지정하는 템플릿 매개 변수입니다.

newElement
이 배열에 배치할 요소입니다.

nCount
이 요소를 삽입해야 하는 횟수입니다(기본값: 1).

nStartIndex
에서 반환 GetUpperBound한 값보다 클 수 있는 정수 인덱스입니다.

pNewArray
이 배열에 추가할 요소가 포함된 다른 배열입니다.

설명

이 프로세스에서는 이 인덱스에서 기존 요소를 위로 이동(인덱스 증가)하고 위의 모든 요소를 위로 이동합니다.

두 번째 버전은 위치에서 시작하여 다른 CArray 컬렉션의 모든 요소를 삽입합니다 nStartIndex .

반면 함수는 SetAt 지정된 배열 요소 하나를 대체하며 요소를 이동하지 않습니다.

예시

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

배열이 비어 있는지 여부를 확인합니다.

BOOL IsEmpty() const;

Return Value

배열에 요소가 없는 경우 0이 아닙니다. 그렇지 않으면 0입니다.

CArray::operator []

이러한 아래 첨자 연산자는 및 GetAt 함수를 SetAt 편리하게 대체합니다.

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

매개 변수

TYPE
이 배열의 요소 형식을 지정하는 템플릿 매개 변수입니다.

nIndex
액세스할 요소의 인덱스입니다.

설명

없는 const배열에 대해 호출된 첫 번째 연산자는 assignment 문의 오른쪽(r-value) 또는 왼쪽(l-value)에서 사용할 수 있습니다. 배열에 대해 const 호출되는 두 번째 배열은 오른쪽에서만 사용할 수 있습니다.

라이브러리의 디버그 버전은 할당 문의 왼쪽 또는 오른쪽에 있는 아래 첨자가 범위를 벗어나면 어설션됩니다.

예시

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

배열이 증가하거나 축소되어야 하는 경우 데이터를 새 버퍼로 재배치합니다.

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

매개 변수

pNewData
요소 배열에 대한 새 버퍼입니다.

pData
요소의 이전 배열입니다.

nCount
이전 배열의 요소 수입니다.

설명

pNewData 는 항상 모든 pData 요소를 보유할 수 있을 만큼 큽합니다.

이 구현에서는 CArray 배열이 증가하거나 축소되어야 할 때(또는 FreeExtra 호출되는 경우SetSize) 이전 데이터를 새 버퍼에 복사하는 데 이 메서드를 사용합니다. 기본 구현은 데이터를 복사합니다.

요소가 자체 멤버 중 하나에 대한 포인터를 포함하거나 다른 구조체가 배열 요소 중 하나에 대한 포인터를 포함하는 배열의 경우 포인터는 일반 복사본으로 업데이트되지 않습니다. 이 경우 관련 형식의 특수화를 RelocateElements 구현하여 포인터를 수정할 수 있습니다. 또한 데이터 복사를 담당합니다.

CArray::RemoveAll

이 배열의 모든 요소를 반환합니다.

void RemoveAll();

설명

배열이 이미 비어 있으면 함수는 계속 작동합니다.

예시

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

배열의 지정된 인덱스에서 시작하는 하나 이상의 요소를 제거합니다.

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

매개 변수

nIndex
0보다 크거나 같고 반환된 값 GetUpperBound보다 작거나 같은 정수 인덱스입니다.

nCount
제거할 요소의 수입니다.

설명

이 프로세스에서는 제거된 요소 위의 모든 요소를 아래로 이동합니다. 배열의 상한을 감소시키지만 메모리를 해제하지는 않습니다.

제거 지점 위의 배열에 포함된 것보다 많은 요소를 제거하려고 하면 라이브러리의 디버그 버전이 어설션됩니다.

예시

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

지정된 인덱스에서 배열 요소를 설정합니다.

void SetAt(INT_PTR nIndex, ARG_TYPE newElement);

매개 변수

nIndex
0보다 크거나 같고 반환된 값 GetUpperBound보다 작거나 같은 정수 인덱스입니다.

ARG_TYPE
배열 요소를 참조하는 데 사용되는 인수의 형식을 지정하는 템플릿 매개 변수입니다.

newElement
지정된 위치에 저장할 새 요소 값입니다.

설명

SetAt 는 배열을 증가시키지 않습니다. 배열이 자동으로 증가하도록 하려면 사용합니다 SetAtGrow .

인덱스 값이 배열에서 유효한 위치를 나타내는지 확인해야 합니다. 범위를 벗어나면 라이브러리의 디버그 버전이 어설션됩니다.

예시

GetAt에 대한 예를 참조하세요.

CArray::SetAtGrow

지정된 인덱스에서 배열 요소를 설정합니다.

void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);

매개 변수

nIndex
0보다 크거나 같은 정수 인덱스입니다.

ARG_TYPE
배열의 요소 형식을 지정하는 템플릿 매개 변수입니다.

newElement
이 배열에 추가할 요소입니다. NULL 값이 허용됩니다.

설명

필요한 경우 배열이 자동으로 증가합니다(즉, 상한이 새 요소를 수용하도록 조정됨).

예시

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

빈 배열 또는 기존 배열의 크기를 설정합니다. 는 필요한 경우 메모리를 할당합니다.

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

매개 변수

nNewSize
새 배열 크기(요소 수)입니다. 0보다 크거나 같아야 합니다.

nGrowBy
크기 증가가 필요한 경우 할당할 요소 슬롯의 최소 수입니다.

설명

새 크기가 이전 크기보다 작으면 배열이 잘리고 사용되지 않는 모든 메모리가 해제됩니다.

배열 사용을 시작하기 전에 이 함수를 사용하여 배열의 크기를 설정합니다. SetSize를 사용하지 않는 경우 배열에 요소를 추가하면 배열이 자주 다시 할당되고 복사됩니다. 이처럼 다시 할당 및 복사가 자주 수행되면 효율성이 떨어지며 메모리가 조각화될 수 있습니다.

nGrowBy 배열이 증가하는 동안 매개 변수는 내부 메모리 할당에 영향을 줍니다. 해당 사용은 보고 GetSize GetUpperBound되는 배열 크기에 영향을 미치지 않습니다. 기본값을 사용하는 경우 MFC는 메모리 조각화를 방지하고 대부분의 경우 효율성을 최적화하기 위해 계산된 방식으로 메모리를 할당합니다.

예시

GetData에 대한 예를 참조하세요.

참고 항목

MFC 샘플 COLLECT
CObject 클래스
계층 구조 차트
CObArray 클래스
컬렉션 클래스 도우미