본문 바로가기

전체 글

(228)
push_back, emplace_back push_back 은 생성된 객체를 넣고, emplace_back 은 정보를 받아 함수 내에서 객체를 생성하여 넣는다. push_back 은 이동 생성자를 호출하고 emplace_back은 호출하지 않는다. emplace_back 을 사용하면 불필요한 객체 생성을 줄일 수 있는 장점이 있지만, 정보만 넣는 특성상 과정이 생략되어져 의도치 않은 결과를 가져올 수 있다. 이러한 결과들은 컴파일러가 잡아주지 않기 때문에 위험하다. 객체를 이동하는 비용이 커질 경우에는 emplace_back 을 사용하여 이동 생성자 호출을 막는 것이 좋다. 실수 및 확실히 알아보기 힘든 코드의 경우에는 push_back 을 사용하여 에러를 방지하는 것이 좋다.
move move 는 rvalue 캐스팅해주는 함수이다. 객체를 인자로 전달하면 rvalue 로 캐스팅 해준다. std::vector v; std::string str = "aaa"; v.push_back(std::move(str)); str.clear(); 위와 같은 상황에서 str 은 move 에 의해 rvalue 로 캐스팅되어진다. v 에 push 되는 객체는 str 이 가리키는 메모리를 받고 str 은 nullptr 이 할당된다. 따라서 str 은 요소와 관련한 함수를 호출 할 수 없지만 clear 할 수 있다. 복사와 이동 차이 복사의 경우 복사가 되어질 근본 변수가 유지된다. 이동의 경우 근본 변수가 사용되어지지 않는다는 가정이 있을 경우 사용되며 이동 후 nullptr 된다. 이동은 기존 변수의 소유..
클래스의 기본 메소드 6가지 정리 1. 기본 생성자 2. 기본 소멸자 3. 복사 생성자 4. 복사 대입 연산자 5. 이동 생성자 6. 이동 대입 연산자 1. 기본 생성자 객체 생성 시 사용자가 초깃값을 명시하지 않았을 때, 컴파일러가 자동으로 제공하는 생성자. 특정 경우에 자동으로 삭제된다. 1. & 혹은 const 멤버변수가 있을 때 2. 기반 클래스의 기본 생성자가 삭제 됐을 때 3. 기반 클래스가 기본 소멸자가 삭제 됐을 때 4. 멤버 변수의 기본 생성자가 삭제 됐을 때 2. 기본 소멸자 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되는 함수. const, volatile, static 으로 선언되 수 없다. 생성자는 여러개 가질 수 있지만 소멸자는 하나만 가질 수 있다. 인자를 가지지 않는다. 특정 경우에 삭제된다. 1. s..
프로그래머스 타겟 넘버 Dfs 사용 시 for 문 안씀 생각. for 문을 쓴다면 모든 경우를 확인할 경우 #include #include #include using namespace std; vector num; vector visited; int tarNum; int DfsSum(int index, int sum) { int ans = 0; if(index == num.size()) { if(sum == tarNum) { return 1; } return 0; } ans += DfsSum(index + 1, sum + num[index]); ans += DfsSum(index + 1, sum - num[index]); return ans; } int solution(vector numbers, int target) { in..
프로그래머스 피로도 탐색에서 다시 돌아온다면 방문을 다시 false 로 만들어주자. 탐색 재귀 시에 그냥 인덱스 쪽에 + 1 만 해주면 되는 경우를 항상 생각하자. 던전의 방문 최대 횟수는 던전의 총 갯수 일 것이기 때문이다. 방문 불가 시 어짜피 다음 던전으로 이동한다. 또 k 의 값을 함수 내에서 변화를 주지 말자. 함수 구현부에서 변화를 주면 해당 반복문 동안 k의 값이 변해있어 문제 풀이가 어렵다. 아래 구문처럼 k를 매개변수로 넣을 때 - 해주자. 그럼 for 문에서 의 k 값에는 변화가 없지만 Dfs 에 재귀 되어질 k 값은 변화가 있다. #include #include using namespace std; vector inDun; vector visited = vector(8, false); int answer..
03 - 2 명령어 2 명령어는 연산 코드와 오퍼랜드로 구성 된다.명려어가 수행할 연산을 연산 코드, 연산에 사용할 데이터나 주소 를 오퍼랜드라고 한다.연산 코드는 연산자, 오퍼랜드는 피연산자라고도 부른다.연산 코드가 담기는 영역을 연산 코드 필드, 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 한다.기계어와 어셈블리어는 명령어라서 연산 코드와 오퍼랜드로 구성된다.오퍼랜드연산에 사용할 데이터나 데이터의 주소 값이다.대부분의 경우에는 메모리 주소 혹은 레지스터 이름을 담기에 주소 필드라고도 부른다.오퍼랜드는 하나의 명령어 안에 존재하지 않거나 다수 존재할 수 있다.가령 오퍼랜드가 없이 연산 코드만 있다면 >> ( 0 - 주소 명령어 )오퍼랜드가 하나 이면 >> ( 1 - 주소 명령어 ) 가 되는 것이다.연산 코드연산 코드는 말 그대..
03 - 1 명령어 컴퓨터가 이해하는 정보에는 데이터와 명령어가 있다고 했다. 이 중 명령어에 대해 공부한다.모든 소스 코드는 컴퓨터 내부에서 명령어로 변환된다.오늘날 개발자가 사용하는 프로그래밍 언어는 대부분 고급 언어이다. 이는 C, C++, Java, Python 등등 다양하다. 허나, 이러한 고급 언어를 컴퓨터는 이해하지 못한다. 반대로 컴퓨터가 이해할 수 있는 언어는 저수준 언어이다. 그리고 이러한 저수준 언어는 명령어로 이루어져 있다. 그래서 우리가 사용하는 고급 언어로 프로그램이 실행되려면 반드시 저수준 언어인 명령어로 변환되야 한다. 저수준 언어에는 2가지 종류가 있는데, 기계어와 어셈블리어 이다. 기계어기계어란 0과 1의 명령어 비트로 이루어진 언어이다. 다만, 무조건 2진법으로만 표현하는 것은 아니고 16..
프로그래머스 1차 비밀지도 #include #include #include using namespace std; vector solution(int n, vector arr1, vector arr2) { vector answer(n); vector translate(n); vector translate2(n); for(int i = 0; i0) { int n = arr1[i] % 2; translate[i] += n + '0'; arr1[i] /= 2; } while(translate[i].length() < n) { translate[i] += '0'; } reverse(translate[i].begin(),translate[i].end()); while(arr2[..