학습
C++ 컬렉션 클래스 (벡터, 리스트 등)
C++ 컬렉션 클래스 (벡터, 리스트 등) — 중급
컬렉션 클래스 (벡터, 리스트 등)
1. 도입 (왜 배워야 하는가)
컬렉션 클래스는 데이터 구조를 효율적으로 관리하는 데 필수적입니다. 실무에서 데이터를 저장하고 처리해야 할 때, 배열과 같은 기본 구조보다는 벡터(vector), 리스트(list), 맵(map) 등의 컬렉션 클래스를 활용하는 것이 일반적입니다. 이러한 클래스들은 데이터의 삽입, 삭제, 검색 등을 더 쉽게 하고, 코드의 가독성을 높여주며, 유지보수를 용이하게 합니다.
만약 이 토픽을 모른다면, 다음과 같은 문제가 발생할 수 있습니다:
- 데이터의 크기가 변경될 때마다 배열을 새로 만들어야 하며, 이는 비효율적입니다.
- 복잡한 데이터 구조를 손쉽게 관리하지 못해 코드가 복잡해지고, 디버깅이 어려워집니다.
2. 핵심 개념 설명
벡터 (Vector)
벡터는 동적 배열로, 데이터의 크기가 가변적입니다. 필요한 만큼 메모리를 자동으로 할당하거나 해제합니다. 예를 들어, 쇼핑몰에서 장바구니에 물건을 담을 때, 물건의 수가 변할 수 있기 때문에 벡터를 사용하면 유용합니다.
리스트 (List)
리스트는 비순차적인 데이터 구조로, 각 요소가 이전 및 다음 요소를 가리킵니다. 물건을 삽입하거나 삭제할 때, 리스트는 빠른 속도로 작업을 수행할 수 있습니다. 이는 마치 사람의 친구 관계처럼, 각 친구가 서로의 정보를 알고 있는 것과 비슷합니다.
| 용어 | 설명 |
|---|---|
| 벡터 | 동적 크기의 배열. 필요한 만큼 자동 확장. |
| 리스트 | 요소가 서로 연결된 형태. 삽입/삭제가 용이. |
3. 기본 코드 예제
벡터 사용 예제
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers; // 빈 벡터 생성
numbers.push_back(10); // 10 추가
numbers.push_back(20); // 20 추가
numbers.push_back(30); // 30 추가
for (int number : numbers) {
std::cout << number << " "; // 각 요소 출력
}
return 0;
}
// 실행 결과: 10 20 30
std::vector<int> numbers;: 빈 정수형 벡터를 생성합니다.numbers.push_back(10);: 벡터의 끝에 10을 추가합니다.for (int number : numbers): 벡터의 각 요소를 반복하여 출력합니다.리스트 사용 예제
#include <iostream>
#include <list>
int main() {
std::list<int> numbers; // 빈 리스트 생성
numbers.push_back(10); // 10 추가
numbers.push_back(20); // 20 추가
numbers.push_back(30); // 30 추가
for (int number : numbers) {
std::cout << number << " "; // 각 요소 출력
}
return 0;
}
// 실행 결과: 10 20 30
std::list<int> numbers;: 빈 정수형 리스트를 생성합니다.numbers.push_back(10);: 리스트의 끝에 10을 추가합니다.for (int number : numbers): 리스트의 각 요소를 반복하여 출력합니다.4. 실전 활용 예제
쇼핑몰 장바구니 구현
#include <iostream>
#include <vector>
class ShoppingCart {
public:
void addItem(int item) {
items.push_back(item); // 물건 추가
}
void showItems() {
for (int item : items) {
std::cout << "장바구니에 있는 물건: " << item << std::endl;
}
}
private:
std::vector<int> items; // 물건 목록을 저장하는 벡터
};
int main() {
ShoppingCart cart;
cart.addItem(101); // 물건 101 추가
cart.addItem(202); // 물건 202 추가
cart.showItems(); // 장바구니 내용 출력
return 0;
}
// 실행 결과:
// 장바구니에 있는 물건: 101
// 장바구니에 있는 물건: 202
ShoppingCart 클래스는 벡터를 사용하여 장바구니의 물건을 관리합니다.고객 리스트 관리
#include <iostream>
#include <list>
#include <string>
class CustomerList {
public:
void addCustomer(std::string name) {
customers.push_back(name); // 고객 추가
}
void showCustomers() {
for (std::string name : customers) {
std::cout << "고객 이름: " << name << std::endl;
}
}
private:
std::list<std::string> customers; // 고객 이름 목록을 저장하는 리스트
};
int main() {
CustomerList cl;
cl.addCustomer("홍길동");
cl.addCustomer("김철수");
cl.showCustomers(); // 고객 목록 출력
return 0;
}
// 실행 결과:
// 고객 이름: 홍길동
// 고객 이름: 김철수
CustomerList 클래스는 리스트를 사용하여 고객의 이름을 관리합니다.5. 흔한 실수와 주의사항
실수 1: 벡터의 크기 초과
std::vector<int> vec;
for (int i = 0; i <= 10; i++) {
vec.at(i) = i; // 이곳에서 예외 발생
}
at()는 벡터의 범위를 벗어날 경우 예외를 발생시킵니다. 이를 방지하기 위해 벡터의 크기를 미리 확인해야 합니다.실수 2: 리스트의 반복자 사용
std::list<int> myList;
myList.push_back(1);
myList.push_back(2);
for (auto it = myList.begin(); it != myList.end(); ++it) {
myList.erase(it); // 잘못된 접근
}