-
<vector>, <queue>, <string>코테/c++ 2023. 2. 22. 22:53
# include <vector>
백터 임포트
vector<int> v; vector<int> v(5); -> (0,0,0,0,0) vector<int> v(5,2); -> (2,2,2,2,2) vector<int> v = {1,2,3,4,5}; vector<int> v; //전역변수 v = vector<int>(3); //메인함수
벡터 선언
*벡터는 미리 크기를 선언할 필요 없지만
v[1] = 3; 이런 식으로 값을 넣으려면 v[1]이 선언되어있어야 함
vector<vector<int>> v; vector<vector<int>> v(3, vector<int>(5,0)); *v[0][0]~v[2][4] 접근 가능 vector<vector<int>> v(3); *v[2].push_back()만 가능
2차원 벡터 선언 및 할당
vector<pair<int,int>> v; v.push_back({1,2}); int one = v.back().first; int two = v.back().second;
pair를 사용한 벡터 선언
vector<int,pair<int,int>> v; // 오류 vector<pair<int,pair<int,int>>> v; // 정답
{1,{2,3}} 과 같은 형태의 벡터도 2번의 pair를 써야함. 주의
vector<int> v2(v1);
벡터 복사
v.front(); -> 첫번째 값 v.back(); -> 마지막 값 v.push_back(7); -> 맨 끝에 값 추가 v.pop_back(); -> 마지막 값 제거
front는 첫번째 값 // begin은 첫번째 값의 주소를 가리키는 포인터
back은 마지막 값 // end는 마지막 값의 "다음" 칸 주소를 가리키는 포인터
int max = *max_element(v.begin(), v.end()); int min = *min_element(v.begin(), v.end());
벡터의 최대값 최소값
sort(v.begin(), v.end()); reverse(v.begin(), v.end());
벡터 정렬 + 거꾸로(=역정렬)
두 함수는 <algorithm>을 include 해줘야한다
bool compare(int a, int b){ return a>b; } sort(v.begin(), v.end(), compare);
a>b
앞이 뒤보다 클 경우 -> true 리턴 -> 앞이 뒤보다 크게 정렬 = 역정렬
앞이 뒤보다 작을 경우 -> false 리턴 -> 뒤가 앞보다 크지만 둘이 바뀜 = 역정렬
bool cmp(vector<int> &v1, vector<int> &v2){ if(v1[1] == v2[1]) return v1[0]<v2[0]; else return v1[1]<v2[1]; } sort(v.begin(), v.end(), cmp);
2차원 벡터에서 n번쨰 항을 기준으로 정렬하는 예제
v.erase(unique(v.begin(), v.end()), v.end());
중복 제거
unique: 벡터에 "연속된" 중복값이 있을 경우 해당 값을 뒤로 옮긴다 = 정렬되어 있어야 함
erase: 주어진 범위를 지운다. unique는 뒤로 보내진 중복 값의 시작 주소를 리턴한다.
v.size(); -> 원소 개수 리턴 v.empty(); -> 비어있으면 true 리턴 v.insert(2,3); -> 2번째 위치에 값 '3' 삽입 v.insert(2,3,4); -> 2번째 위치에 값 '4'를 3개 삽입 v.erase(iter); -> iter가 가리키는 원소 제거 v.clear(); -> 벡터 초기화
그 외 메소드
for (auto i:v){ cout<<i; }
벡터 반복문
오른쪽 방식이 코드는 간결하지만 속도는 큰 차이 없는듯
for(int i=0 ; i<v.size() ; i++){} v.size = vv; for(int i=0 ; i<vv ; i++){}
반복문 내에서 벡터의 크기가 변경될경우 v.size() 값도 실시간으로 변경된다.
오류 방지를 위해 따로 변수를 두는게 좋음.
#include <queue>
큐 임포트
queue<int> q; queue<pair<int,int>> q;
큐 선언
큐는 출력이 ㅈ같으므로 개수로 상태 확인!
q.push(1); q.pop(); q.front(); q.back(); q.size(); while(!q.empty())
큐 함수
#include <string>
스트링 임포트
string str = "abcdef"; string str2(str);
스트링 선언 & 복사
str.clear()
문자열 초기화
str.find("abcd"); if (str.find("a") != string::npos) { cout << "Found!";} else { cout << "Not found"; }
string 속에서 특정 문자열 찾기
찾으면 해당 문자열의 시작 주소를,
못찾으면 string::npos를 리턴한다
int pos = 0; int counts = 0; while (word.find(str, pos) != std::string::npos) { counts ++; pos += word.find(str, pos) + str.length(); }
특정 문자열이 몇개 있는지 탐색
find(a,b)는 a 문자열이 b 위치부터 몇개 있는지 탐색하며
b는 b + 찾았을 때 해당 문자열 시작 주소값 + 찾은 문자열 길이 이다
int t=7; string str = "7="+to_string(t);
스트링에 다른 타입 넣기
반대는 stoi()
str.substr(7); -> 7번째부터 끝까지 반환 str.substr(7,3); -> 7~9 str.compare(str2); -> 같으면 0 str.append(str2); -> str1+=str2
스트링 함수
+
string으로 "12"가 주어졌다면
string[0]은 1이 아닌 "1" = 49이다.
(int)string[0]도 마찬가지
+
6 10 2 777이 주어졌을때
int면 작은 순서대로 - 2 6 10 777
string이면 사전 순서대로 10 2 6 777