삽입/삭제는 맨 뒤에 하는 것이 좋음(중간 삽입/삭제는 배열 복사가 필요하기 때문에 비효율 적임.)
벡터의 선언 : 선언의 방식은 타입만 명시하거나 초기값까지 같은 선언하는 경우가 있음
빈 벡터를 선언하거나 특정 값으로 초기화하는 방법.
초기화 리스트를 사용하여 벡터를 선언하는 방법.
<특정 값으로 벡터를 초기화할 때 자주 사용, 초기화하는 원소의 개수가 적을 때 주로 활용함>
다른 벡터를 복사하거나 대입하는 방법.
<기존에 생성된 벡터의 복사본을 만들 때 많이 사용함>
2차원 배열처럼 벡터를 사용하는 방법.
<벡터의 타입을 벡터로 선언하여 2차원 벡터처럼 사용하는 방법.>
벡터의 동작
push_back
벡터의 맨 끝에 원소를 추가하는 메서드이다. 원소의 개수가 늘어남에 따라 크기는 자동으로 증가하여 별도의 메모리 관리를 신경 쓸 필요가 없다.
pop_back
벡터의 맨 끝에 원소를 제거하는 메서드이다. 맨 끝 원소가 제거되면 벡터 크기가 자동으로 줄어들게 된다.
size
벡터의 크기(원소 개수)를 확인할 때 사용하는 메서드이다. 보통 벡터의 전체 원소를 대상으로 반복문을 돌리 때 유용하게 쓰임
erase
특정 위치(또는 구간)의 원소를 제거하는 함수이다. 벡터는 내부적으로 배열을 사용하므로, 중간 원소를 삭제할 때, 많은 원소를 옮겨야 할 수 있음. => 시간 복잡도가 커질 수 있으므로, 자주 사용하지 않는 것이 좋음
맵
맵은 키를 활용하여 값과 함께 쌍으로 저장하고, 특정 키를 사용하여 값을 검색하는 기능을 제공하는 연관 컨테이너이다.
맵의 특징
키-값 쌍은 pair<const Key, Value>형태로 저장됨
키값을 기준으로 내부 데이터가 자동으로 정렬됨
중복된 키값을 허용하지 않음
맵의 선언
맵을 선언할 때 키-값 쌍을 저장하기 위해 키 타입과 값 타입 두가지를 지정해야함. 이 두 타입은 동일할 수도 있고, 서로 다를 수도 있으며, 키 타입은 비교 연산이 가능해야함.
<좌>키와 값이 다를 경우 / <우>키와 값이 같은 경우
맵의 동작
map은 key 순으로 오름차순 정렬됨
사용자가 따로 정렬을 수행하지 않아도, 삽입 및 삭제가 이루어질 때마다 내부적으로 정렬상태를 유지하기 때문
insert()
make_pair()를 이용하여 pair 객체를 생성한 후 insert 함수를 사용할 수 있음.
{}(스코프)를 활용한 방법이나 [](인덱스)를 사용하여 값을 추가할 수 있음.
find()
find 메서드를 사용하면 특정 키가 map에 존재하는지 확인할 수 있음
find는 키가 존재하면 해당 키의 이터레이터를 반환하고, 존재하지 않으면 map.end()를 반환함.
size()
맵에 키-값 쌍의 개수를 반환하는 함수
erase(key)
맵의 특정 key를 가진 요소만 삭제함
clear()
맵에 있는 모든 원소를 삭제하는 함수.
clear는 맵뿐 아니라 대부분 컨테이너에 존재함
알고리즘
sort
컨테이너 내부의 데이터를 정렬하는 함수
기본타입(int, double 등)의 경우 사용자 정렬 함수 없으면 오름차순으로 정렬됨 또한 사용자 정렬 함수를 정의할 수도 있음
사용자 정렬 함수comp(a, b)구현 시 true이면 a와 b의 순서는 유지됨 하지만 false인 경우 a와 b의 순서를 바꿈
#include <iostream>
#include <algorithm> // sort 함수를 사용하기 위해 선언해주어야 함
using namespace std;
bool compare(int a, int b) {
return a > b; // 내림차순
}
int main() {
int arr[] = {5, 2, 9, 1, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);
// 내림차순 정렬
sort(arr, arr + size, compare); //arr부터 arr+size까지 compare의 규칙에 따라서 정렬함
// 결과 출력
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
return 0;
}
find
컨테이너 내부에서 특정 원소를 찾아 해당 원소의 반복자를 반환하는 함수이다.
find(first last, 찾을 값)과 같이 사용함
find(first, last)가 탐색 대상
원소를 찾은 경우 해당 원소의 반복자를 반환
원소를 찾지 못한경우 last 반복자를 반환함
#include <iostream>
#include <vector> //vector를 사용하기 위해 선언
#include <algorithm> // find 함수를 사용하기 위해 선언
using namespace std;
int main() {
vector<int> vec = {10, 20, 30, 40, 50};
// 특정 값 30을 찾음
auto it = find(vec.begin(), vec.end(), 30); //vec의 begin(맨앞)부터 end(끝까지) 탐색하여 30을 찾을것이다.
if (it != vec.end()) {
cout << "값 30이 벡터에서 발견됨, 위치: " << (it - vec.begin()) << endl;
} else {
cout << "값 30이 벡터에 없음" << endl;
}
return 0;
}
반복자
알고리즘의 사용
알고리즘은 반복자를 기반으로 작동하기 때문에, 컨테이너의 내부 구현방식을 몰라도 알고리즘을 활용하는 것에 문제가 없음
반복자는 컨테이너의 요소에 대한 일관된 접근 방식을 제공, 때문에 알고리즘이 특정 컨테이너의 내부 구현과 무관하게 동작할 수 있음
순방향 반복자
앞에서부터 뒤로 순차적으로 순회하는 반복자
begin()은 컨테이너의 첫 번째 원소를 가리키는 반복자이다.
end()는 컨테이너의 마지막 원소 다음을 가리키는 반복자이다.
일관된 반복 구조를 유지하고 탐색 실패를 쉽게 표현할 수 있기 때문에, end()를 마지막 원소 다음을 가리키도록 정함
역방향 반복자
컨테이너의 마지막 원소부터 첫 번째 원소가지 역순으로 순회할 수 있도록 해주는 반복자
rbegin()은 컨테이너의 마지막 원소를 가리키는 역방향 반복자이다.
rend()는 컨테이너의 첫 번째 원소 이전을 가리키는 역방향 반복자이다.
컨테이너의 첫 번째 원소까지 탐색했지만 원하는 원소를 찾지 못한 경우, rend()를 반환하여 탐색 실패를 명확하게 표현할 수 있음.