본문 바로가기
프로그래밍/C++

[C++] STL 활용법: 벡터, 리스트, 맵으로 데이터 다루기 💡

by 다다면체 2025. 1. 6.
728x90
반응형

C++의 표준 템플릿 라이브러리(STL)는 데이터를 효율적으로 관리하고 처리하기 위한 강력한 도구 모음이에요. 오늘은 STL의 주요 구성 요소인 벡터, 리스트, 맵을 중심으로 살펴보고, 활용 팁도 함께 공유할게요! 😊 준비되셨다면, 바로 시작해 볼까요? 🚀


반응형

1. 벡터: 동적 배열의 강력한 대안 📊

벡터는 크기가 동적으로 변하는 배열로, 요소의 추가와 삭제가 용이합니다.

(1) 기본 사용법

📌 예제

#include <vector>
#include <iostream>

std::vector<int> numbers = {1, 2, 3, 4, 5};
numbers.push_back(6); // 요소 추가
numbers.pop_back();   // 마지막 요소 삭제

for (int num : numbers) {
    std::cout << num << " ";
} // 1 2 3 4 5 출력

(2) 주요 함수

  • push_back: 요소 추가
  • pop_back: 마지막 요소 제거
  • size: 현재 크기 반환
  • at: 안전하게 요소 접근 (범위 검사 포함)

(3) 벡터의 장단점

  • 장점: 배열보다 유연하며, 메모리를 자동으로 관리합니다.
  • 단점: 중간 요소 삽입 및 삭제는 느릴 수 있습니다.

2. 리스트: 양방향 연결 리스트 🌐

리스트는 노드 구조를 기반으로 하며, 삽입과 삭제가 효율적입니다. 특히, 자주 변동되는 데이터를 다룰 때 유용해요.

(1) 기본 사용법

📌 예제

#include <list>
#include <iostream>

std::list<int> numbers = {1, 2, 3, 4, 5};
numbers.push_front(0); // 앞에 요소 추가
numbers.push_back(6);  // 뒤에 요소 추가
numbers.pop_front();   // 앞 요소 제거

for (int num : numbers) {
    std::cout << num << " ";
} // 1 2 3 4 5 6 출력

(2) 주요 함수

  • push_front: 앞에 요소 추가
  • push_back: 뒤에 요소 추가
  • pop_front: 앞 요소 제거
  • erase: 특정 위치 요소 제거

(3) 리스트와 벡터의 차이

  • 리스트: 삽입과 삭제가 빠르지만, 임의 접근이 느림.
  • 벡터: 임의 접근이 빠르지만, 중간 삽입/삭제가 느림.

3. 맵: 키-값 쌍으로 데이터 관리하기 🔑

맵은 데이터를 키와 값의 쌍으로 저장하며, 키를 기준으로 정렬된 상태를 유지합니다.

(1) 기본 사용법

📌 예제

#include <map>
#include <iostream>

std::map<std::string, int> scores;
scores["Alice"] = 90;
scores["Bob"] = 85;
scores["Charlie"] = 95;

for (const auto& pair : scores) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}

(2) 주요 함수

  • insert: 새로운 키-값 쌍 추가
  • erase: 특정 키 삭제
  • find: 키 검색 (반환 값으로 iterator)
  • count: 키 존재 여부 확인

(3) 맵과 셋의 차이

  • 맵(map): 키-값 쌍 저장
  • 셋(set): 중복 없는 단일 값 저장

4. STL 알고리즘: 효율적인 데이터 처리 🚀

STL은 다양한 알고리즘을 제공하여 데이터 검색, 정렬, 변환 등을 쉽게 수행할 수 있게 해줍니다.

(1) 정렬

📌 예제

#include <vector>
#include <algorithm>
#include <iostream>

std::vector<int> numbers = {5, 3, 8, 1, 2};
std::sort(numbers.begin(), numbers.end());

for (int num : numbers) {
    std::cout << num << " ";
} // 1 2 3 5 8 출력

(2) 검색

📌 예제

#include <vector>
#include <algorithm>
#include <iostream>

std::vector<int> numbers = {1, 2, 3, 4, 5};
if (std::binary_search(numbers.begin(), numbers.end(), 3)) {
    std::cout << "3 is found!" << std::endl;
}

(3) 변환

📌 예제

#include <vector>
#include <algorithm>
#include <iostream>

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::transform(numbers.begin(), numbers.end(), numbers.begin(), [](int x) { return x * 2; });

for (int num : numbers) {
    std::cout << num << " ";
} // 2 4 6 8 10 출력

5. 핵심과 주의할 점 ⚡

핵심 요약

  1. 벡터는 동적 배열로, 크기 변화와 임의 접근에 적합합니다.
  2. 리스트는 삽입과 삭제가 빈번한 경우 유용합니다.
  3. 맵은 키-값 쌍으로 데이터를 관리하며, 정렬된 상태를 유지합니다.
  4. STL 알고리즘을 활용하면 데이터 처리를 더욱 간결하고 효율적으로 구현할 수 있습니다.

알고 있으면 좋은 팁

  • 메모리 관리: STL 컨테이너는 메모리를 자동으로 관리하지만, 필요 시 명시적으로 정리(clear)하세요.
  • 커스텀 정렬: std::sort에 사용자 정의 비교 함수를 전달해 맞춤 정렬을 구현할 수 있습니다.

📌 예제

std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; }); // 내림차순 정렬
  • 성능: 벡터는 대량 데이터 처리에 더 적합하고, 리스트는 작은 데이터셋에서 강력합니다.

6. 마무리 🎉

STL은 C++ 프로그래머의 강력한 무기예요. 컨테이너와 알고리즘의 조합을 잘 이해하면 복잡한 데이터 처리도 간단히 해결할 수 있습니다. 오늘 배운 내용을 실제 코드에 적용하며, STL의 효율성을 직접 경험해 보세요! 다음 시간에는 더 흥미로운 주제를 다뤄보겠습니다. 😊

728x90
반응형