C++의 STL 정리

ChoRong0824·2023년 5월 7일
0

C

목록 보기
16/17
post-thumbnail

Vector

배열과 거의 비슷하지만, 메모리를 잡아주지 않아도 된다는 점에서 차이가 존재합니다.
쉽게 생각해서, 배열 동적할당의 상위호환이라고 생각하면 쉽습니다.
배열 동적 할당은 포인터 사용하셔도 되고, 자세한 내용은 필자가 따로 포스팅한 c++ 객체 part를 확인해보시면 더욱 쉬울 것 같습니다.

#include <vector>

생성

vector<int> v1; // V1의 빈 벡터 생성
vector<int> v2(3); // default값 0으로 초기화된 크기 3의 벡터
// v2 = [0,0,0]
vector<int> v3(3,1); // 1로 초기화된 크기 3의 벡터
// v3 = [1,1,1]
vector<int> v4(v3); // v3를 복사해서 생성
// v4 = [1,1,1]

assign

C++에서 assign은 객체에 새로운 값을 할당하는 멤버 함수입니다. 클래스에 따라 구체적인 문법과 동작이 달라지며, 예를 들어 std::string 클래스의 assign 함수는 문자열 객체에 새로운 값을 할당합니다.

v.assign(5,2);
// v = [2,2,2,2,2]

원소 참조

v.at(index);
v[index]; // index의 원소를 참조
v.front(); // 첫 번째 원소 참조
v.back(); // 마지막 원소 참조

원소 추가

v.push_back(item); // 마지막 원소 뒤에 item 삽입
v.insert(index, item); // index 위치에 item 삽입
// 삽입한 곳의 iterator 반환
v.insert(index, count, item); // index 위치에 count 개수만큼 item 삽입

원소 제거

v.clear(); //모든 원소 제거
v.pop_back(); // 마지막 원소를 제거
v.erase(iterator); //iterator가 위치한 원소를 제거

크기 연산

v.size(); //원소의 개수를 반환
v.empty(); // size가 0이면 true 반환

여기까지가 벡터


Stack

header

#include <stack> 추가 해줌. 즉 선언해야 사용가능.

생성

stack<int> st; // 생성

추가

st.push(item); // item 삽입. 파라미터를 넘긴다고 생각해도 됨.

제거

st.pop(); // top이 가르키는 원소 제거

값 읽기

st.top(); // 가장 위에 있는 원소 반환

원소 개수

st.size(); //원소 개수 반환
st.empty(); //비어있으면 true 반환

여기까지가 스택영역 (메모리) 사용


Queue

header

#include <queue>

생성

queue<int> q;

추가

q.push(item); // item 삽입

제거

q.pop(); // 가장 앞의 원소 제거

값 읽기

q.front(); // 가장 앞에 있는 원소 반환

원소 개수

q.size(); //원소 개수 반환
q.empty(); //비어있으면 true 반환

여기까지 큐영역 (메모리) 사용하는 방법


Priority Queue

header 부분 선언

#include <queue>

생성

priority_queue<int> pq; //내림차순 less<> 기반
priority_queue<int, vector<int>, greater<int>> pq; //오름차순 기반
priority_queue<int, vector<int>, cmp> pq; //사용자 지정 정렬 기준으로 생성 가능  
//cmd는 따로 구현

추가

pq.push(item); // item 삽입

제거

pq.pop(); // top이 가르키는 원소 제거

값 읽기

pq.top(); // 가장 위에 있는 원소 반환

원소 개수

  • pq.size(); //원소 개수 반환
  • pq.empty(); //비어있으면 true 반환

Deque

header

#include <deque>

생성

deque<int> dq;

추가

dq.push_front(item);// 첫 번째 원소 앞에 item 삽입
dq.push_back(item);// 마지막 원소 뒤에 item 삽입
dq.insert(index, item);// index 위치에 item 삽입
dq.insert(index, count, item);// index 위치에 item을 count번 삽입

제거

dq.pop_front();// 첫 번째 원소 제거
dq.pop_back();// 마지막 원소 제거
dq.clear();// 모든 원소 제거
dq.erase(iterator);//iterator가 가르키는 원소 제거

값 읽기

dq.at(index);
dq[index]; // index 번째 원소 참조
dq.front(); // 첫 번째 원소 참조
dq.back(); // 마지막 원소 참조

원소 개수

dq.size(); //원소 개수 반환
dq.empty(); //비어있으면 true 반환

Set, MultiSet

header

#include <set>

생성

set<int> s;
set<pair<int,int>> s;
multiset<int> s;
multiset<vector<int>> s;

추가

s.insert(item);// item 삽입

제거

s.clear();  // 모든 원소 제거
s.erase(iter);  // iter이 가르키는 위치의 원소를 제거
s.erase(start, end);  // [start, end) 범위의 원소 모두 제거

값 읽기

s.find(item); // item을 가르키는 iter 반환, 없으면 s.end() 반환
s.upper_bound(item); // item이 끝나는 구간의 iter 반환
s.lower_bound(item); // item이 시작하는 구간의 iter 반환
s.equal_range(item); // 시작하는 구간과 끝나는 구간의 iter pair 객체 반환

원소 개수

s.empty(); // s가 비어있는지 확인
s.count(item); // item의 개수 반환
s.size(); // s의 원소 개수 반환

솔직하게, 맵이랑 벡터는 꼭 알아두었으면 하는 것이 필자의 생각입니다.

Map, MultiMap

header

#include <map>

생성

map<int, int> m;
map<string,int> m;
multiset<int> m;
multiset<vector<int>> m;

추가

m[key] = val;  //key가 가르키는 위치에 val 삽입
m.insert(item);  // item은 pair 객체

제거

m.clear(); // 모든 원소 제거
m.erase(iter); // iter이 가르키는 위치의 원소를 제거
m.erase(start, end); // [start, end) 범위의 원소 모두 제거

값 읽기

m.find(item); // item을 가르키는 iter 반환, 없으면 s.end() 반환
m.upper_bound(item); // item이 끝나는 구간의 iter 반환
m.lower_bound(item); // item이 시작하는 구간의 iter 반환
m.equal_range(item); // 시작하는 구간과 끝나는 구간의 iter pair 객체 반환

원소 개수

m.empty(); // s가 비어있는지 확인
m.count(item); // item의 개수 반환
m.size(); // s의 원소 개수 반환

필자가 해당(출처) 포스트를 읽고, 해당 포스트가 핵심만 간추려서 설명한 것이 좋아서 참고해서, 제가 모르는 부분 및 추가적인 내용이 필요한 부분은 재작성하고, 가독성이 좋게 일부 수정해서 포스팅하게 되었습니다.

profile
정진, "어제보다 더 나은 오늘이 되자"

0개의 댓글