티스토리 뷰

반응형
#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;

}

 

 

반응형