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