C++

vector와 array

Barbarian developer 2024. 9. 25. 10:08

벡터(vector)

1. 벡터의 장&단점

벡터는 필요에 따라 크기를 자유롭게 조절할 수 있는 동적 배열이라고 할 수 있습니다.

  • 장점:
    • 유연성 : 데이터 개수가 미리 정해져 있지 않아도 돼요! 필요할 때마다 데이터를 추가하거나 삭제할 수 있습니다.
    • 편리성 : 데이터 접근, 삽입, 삭제 등 다양한 기능을 제공해서 사용하기 편리합니다.
    • 효율성 : 메모리 관리를 자동으로 해주기 때문에 메모리 낭비를 줄일 수 있습니다.
  • 단점:
    • 약간의 오버헤드 : 크기를 조절하는 과정에서 약간의 시간이 더 걸릴 수 있습니다. 하지만 대부분의 경우에는 큰 문제가 되지 않는다고 합니다.

 

2. 벡터의 사용법

벡터는 단순히 데이터를 저장하는 것 이상의 다양한 기능을 제공합니다. 필요에 따라 다양한 작업을 수행할 수 있습니다.

생성:

  • vector<int> myVector; - 비어 있는 벡터 생성
  • vector<int> myVector(5); - 크기가 5이고 모든 요소가 0으로 초기화된 벡터 생성
  • vector<int> myVector(5, 10); - 크기가 5이고 모든 요소가 10으로 초기화된 벡터 생성
  • vector<int> myVector2(myVector); - myVector를 복사하여 새로운 벡터 생성

데이터 추가 및 삭제:

  • myVector.push_back(20); - 벡터의 끝에 20 추가
  • myVector.pop_back(); - 벡터의 마지막 요소 삭제
  • myVector.insert(myVector.begin() + 2, 30); - 세 번째 위치에 30 삽입
  • myVector.erase(myVector.begin() + 1); - 두 번째 요소 삭제

데이터 접근:

  • myVector[0]; - 첫 번째 요소에 접근
  • myVector.at(2); - 세 번째 요소에 접근 (범위 검사 수행)
  • myVector.front(); - 첫 번째 요소에 접근
  • myVector.back(); - 마지막 요소에 접근

크기 및 용량:

  • myVector.size(); - 현재 벡터에 저장된 요소의 개수 반환
  • myVector.capacity(); - 현재 벡터가 할당한 메모리 공간의 크기 반환
  • myVector.empty(); - 벡터가 비어 있는지 확인 (비어 있으면 true, 아니면 false 반환)
  • myVector.resize(10); - 벡터의 크기를 10으로 변경
  • myVector.reserve(20); - 벡터의 용량을 20으로 변경 (메모리 재할당 횟수 감소)

정렬 및 검색:

  • sort(myVector.begin(), myVector.end()); - 벡터의 요소를 오름차순으로 정렬
  • reverse(myVector.begin(), myVector.end()); - 벡터의 요소를 역순으로 정렬
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> myVector;
    myVector.push_back(10);
    myVector.push_back(20);
    myVector.push_back(30);

    cout << myVector.at(1) << endl; 
    cout << myVector.size() << endl;
    cout << myVector.front() << endl;
    cout << myVector.back() << endl;

    return 0;
}

<출력문>

20
3
10
30

array 템플릿 클래스

array 템플릿 클래스의 장&단점

array는 마치 크기가 정해진 상자와 같습니다. 한 번 정해진 크기는 변경할 수 없지만, 데이터를 안전하고 효율적으로 저장합니다.

  • 장점:
    • 데이터 안정성: 크기가 고정되어 있어 데이터를 안전하게 저장하고 관리할 수 있어요.
    • 메모리 효율성: 데이터를 연속된 메모리 공간에 저장하여 메모리 접근 속도가 빠르고 효율적이에요.
    • 간결한 코드 작성: 사용하기 쉽고 간결한 코드 작성을 가능하게 해요.
  • 단점:
    • 크기 변경 불가: 한 번 정해진 크기는 변경할 수 없어요. 따라서 데이터 개수가 유동적인 경우에는 사용하기 어려울 수 있어요.

2. array의 사용법

array는 데이터를 안전하게 보관할 뿐만 아니라, 데이터를 쉽게 다룰 수 있는 다양한 기능도 제공합니다. 필요에 따라 여러 가지 작업을 수행할 수 있습니다.

생성:

  • array<int, 5> myArray; - 크기가 5인 int형 array 생성 (모든 요소는 0으로 초기화)
  • array<int, 5> myArray = {10, 20, 30, 40, 50}; - 크기가 5인 int형 array 생성 및 초기화
  • array<int, 5> myArray2(myArray); - myArray를 복사하여 새로운 array 생성

데이터 접근 및 수정:

  • myArray[0]; - 첫 번째 요소에 접근
  • myArray.at(2); - 세 번째 요소에 접근 (범위 검사 수행)
  • myArray.front(); - 첫 번째 요소에 접근
  • myArray.back(); - 마지막 요소에 접근
  • myArray[1] = 30; - 두 번째 요소의 값을 30으로 변경

크기 및 정보:

  • myArray.size(); - array의 크기 (즉, 요소의 개수) 반환
  • myArray.empty(); - array가 비어 있는지 확인 (비어 있으면 true, 아니면 false 반환)

vector객체, array객체의 비교

#include <iostream>
#include <vector>   // STL C++98 표준 템플릿 라이브러리의 벡터 포함
#include <array>    // C++11 표준의 배열 포함

using namespace std; 

int main()
{
    // C, 원래 C++ 방식
    double a1[4] = {1.2, 2.4, 3.6, 4.8}; // 크기 4의 double형 배열 a1 생성 및 초기화

    // C++98 STL 방식
    vector<double> a2(4);    // 크기 4의 double형 벡터 a2 생성
    // C++98에서는 간단하게 초기화할 방법이 없음
    a2[0] = 1.0/3.0; 
    a2[1] = 1.0/5.0;
    a2[2] = 1.0/7.0;
    a2[3] = 1.0/9.0;

    // C++11 -- 배열 객체 생성 및 초기화
    array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};  // 크기 4의 double형 배열 a3 생성 및 초기화
    array<double, 4> a4;
    a4 = a3;        // 같은 크기의 배열 객체끼리 복사 가능

    // 배열 표기법 사용
    cout << "a1[2]: " << a1[2] << " at " << &a1[2] << endl; // a1의 세 번째 요소 값과 주소 출력
    cout << "a2[2]: " << a2[2] << " at " << &a2[2] << endl; // a2의 세 번째 요소 값과 주소 출력
    cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl; // a3의 세 번째 요소 값과 주소 출력
    cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl; // a4의 세 번째 요소 값과 주소 출력

    // 잘못된 배열 사용 예시
    a1[-2] = 20.2; // a1의 범위를 벗어난 인덱스에 값 할당 (실제로는 다른 메모리 영역에 접근)
    cout << "a1[-2]: " << a1[-2] <<" at " << &a1[-2] << endl; 
    cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
    cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;

    // cin.get();
    return 0;
}

<출력문>

a1[2]: 3.6 at 0x7ffe46b401a0
a2[2]: 0.142857 at 0x5ab01c9e2ec0
a3[2]: 1.62 at 0x7ffe46b401c0
a4[2]: 1.62 at 0x7ffe46b401e0
a1[-2]: 20.2 at 0x7ffe46b40180
a3[2]: 1.62 at 0x7ffe46b401c0
a4[2]: 1.62 at 0x7ffe46b401e0