티스토리 뷰
#include <iostream>
#include string
void modify(int& value) { //함수는 void로 생성. &을 붙여주면 call by reference
value =10;
}
int main(){
value = 5;
modify(value);
cout << "값 : " << endl; // 주소값은 &value로 확인. 똑같다.
retrun 0; //main은 return 0;
}
C++ 문법은 참조값 전달이 더 수월하다.
.find("찾을 문자", 찾을 인덱스) => 인덱스 반환
.replae 혹은 + ,+=로 문자 변환
""이 아닌 ''을 사용해야 char 취급
Auto문
STL은 어떤 타입이라도 사용할 수 있지만, auto 키워드를 사용하면 벼수의 타입을 자동으로 추론하여 코드가 더 간결해진다.
세상 참 좋아진듯
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
int main() {
auto value = 5;
cout << "값 :" << value << endl;
auto pi = 3.14242;
cout << pi << endl;
auto greeting = string("Hello, world!");
return 0;
}
범위 기반 반복문
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1,2,3,4,5};
for (int num: vec) {
cout << num << " ";
}
return 0;
}
vector<int>로 정수형 vec 리스트를 생성한다.
v(10) = 크기가 10인 벡터 생성
v(10, 5) = 크기가 10, 모든 요소 5로 초기화
v1 = v2
v1(v2) 는 복사
#include <list>
list<int> a = {1,2,3,4,5};
vector<int> b(a.begin(),a.end());
int arr[] ={1,2,3,4,5};
vector<int> v(arr, arr+5)
arr을 이용해서 arr+5 크기의 리스트를 만듦
Map
python의 dict와 똑같다.
map<string, int> fruitMap = {{"apple", 1} , {"banana", 2}, {"cherry", 3}};
for (const auto& pair : fruitMap) {
cout << pair.first << " " << pair.second << " ";
}
Set
#include <set>
set<string> fruitset = {"apple","banana", "cherry"};
for (const auto& pair : fruitset) {
cout << pair << " ";
}
이 예시에서 STL 컨테이너와 사용할 때는 값을 수정할 필요가 없으므로 auto 대신 상수 레퍼런스를 적용한 const auto&으로 사용한다.
컨테이너를 반복문에서 사용하거나 함수의 인수로 넘길 때는 항상 복사하는 비용을 고려해야 한다.
수정해야 할 떄는 레퍼런스를, 수정하지 않아야 할 때는 상수 레퍼런스 적용을 고려한다.
반복자
C++에서 벡터, 셋, 맵 등의 종류와 관계없이 원소들을 순회하고 접근할 수 있게 해주는 것
모든 컨테이너에 같은 방식으로 원소를 순회하거나 접근할 수 있다.
순방향 반복자 : begin()과 end() 쌍으로 대부분 구성된다.
begin()은 컨테이너의 첫 원소 위치, end()는 컨테이너의 마지막 원소 위치의 다음을 나타낸다.
해당 원소를 찾으면 위치를 반환하고, 그렇지 않으면 end()를 반환한다.
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {10,20,30,40,50};
int arr[] ={1,2,3,4,5};
for (auto it = vec.begin(); it!= vec.end(); ++it) {
cout << *it << " ";
}
cout << endl;
auto result = find(vec.begin(), vec.end(), 30);
if (result !=vec.end()){
cout << "Found: " << *result << endl;
} else {
cout << "Nout found" << endl;
}
return 0;
Map도 출력 형식만 다를 뿐 동일
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {10,20,30,40,50};
map<string, int> myMap = {{"apple", 1} , {"banana", 2}, {"cherry", 3}};
int arr[] ={1,2,3,4,5};
for (auto it = myMap.begin(); it!= myMap.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
cout << endl;
auto result = myMap.find("banana");
if (result !=myMap.end()){
cout << "Found: " << result->first << endl;
} else {
cout << "Nout found" << endl;
}
return 0;
}
역방향 반복자는 rbegin()과 rend()만 사용하면 된다.
rbegin()은 맨 마지막 원소의 위치이고, rend()는 맨 처음 원소의 바로 직전 위치
for (auto it = vec.rbegin(); it!= vec.rend(); ++it) {
cout << *it << " ";
}
STL 컨테이너
벡터, 셋, 맵, 우선순위 큐
컨테이너를 잘못 선택하면 구현해야할 코드의 분량이 늘어나고 알고리즘의 효율이 떨어질 수 있다.
//2차원 벡터 선언
vecotr<vecotr<int>> v1;
//특정 크기로 초기화된 2차원 벡터
int rows = 3;
int cols = 4;
vecotr<vector<int>> v2(rows, vector<int>(cols));
//특정 값으로 초기화된 2차원 벡터
int val = 9;
vecotr<vector<int>> v2(rows, vector<int>(cols,val));
//초기화 리스트를 사용한 2차원 벡터 초기화
vecotr<vecotr<int>> v4 ={
{1,2,3},
{4,5,6},
{7,8,9},
};
veoct<int> v 로 선언하고, v.push_back(6);
v.pop_back();으로 원소 삽입 삭제
v.insert(v.begin(), 1); 1번째에 원소 삽입
v.erase(v.begin()); 맨 앞의 원소 삭제
SET
set = 중복 허용 불가능, 파이썬과 같음
셋에서 원소가 있는지 확인하려면 find 메서드 사용
find 메서드는 ologn임
erase와 insert 사용 가능
맵 또한 ologn으로 검색, 삽입 삭제 가능
문자열을 기준으로 사용한다.
여기서도 find 메서드 사용 가능
다만 맵에 없는 키에 접근하려고 하면 오류가 발생하지 않고 새로운 키가 만들어진다.
삽입 삭제는 마찬가지로 insert , erase 사용 가능
정렬되지 않은 셋과 맵을 사용하려면 unordered_set, unordered_map을 쓰면 된다.
Count, Sort
Count(시작, 끝, 찾을 번호)
s.begin, s.end, 5
가 몇번 나타나는지 센다
sort(시작 반복자, 끝 반복자 )
혹은
sort(시작 반복자, 끝 반복자, 비교 함수)
비교 함수가 들어갔을 때는 비교 함수를 기준으로 범위 내 원소를 정렬한다.
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <algorithm>
using namespace std;
struct Point {
int x,y;
Point(int x, int y) : x(x), y(y) {}
};
bool compare(const Point &a, const Point &b) {
if (a.x == b.x){
return a.y < b.y ; // 좌표가 같으면 y좌표가 적은 순서대로 정렬
}
return a.x < b.x; // x좌표가 적은 순서대로 정렬
}
int main() {
vector<Point> s = {{3,4},{1,2},{3,1},{2,5}};
sort(s.begin(), s.end(),compare);
for (const Point &p :s){
cout << "(" << p.x << ", " << p.y << " )";
}
return 0;
}
next_permutation() 함수로 순열 생성
while (next_permutation(v.begin(), v.end());
unique() 함수로 중복 정리
auto newEnd = unique(v.begin, v.end());
binary_search() 함수로 이진 탐색
시작 반복자, 끝 반복자, 찾을 값
max_element(), min_elment() 함수로 최댓값, 최솟값 탐색
함수
반환 타입 함수명(인수 1, 인수 2...)와 같은 방식으로 정의
반환하는 값이 없다면 타입에 void를 사용한다.
구현 노하후 = 조기 반환
if 후에 return을 사용해서 조기 반환
보호 구문
로직을 시작하기 전 예외 처리 코드를 추가
if (arr.empty() {
return -1;
}
if (N==0) {
return -1;
}