CPP에서 변수 이름 y1을 사용하지 못하는 건에 대하여알고리즘 학습을 위해 C++을 처음 접했을 때, y1을 변수로 사용할 수 없다는 얘기를 들은 적이 있다. 아마 누가 y1을 함수로 만들어뒀다고 했던 걸로 기억한다. 어렴풋이 알고만 있었는데, 왜 안되는지 궁금해져서 포스팅하기로 했다. y1은 베셀 함수를 반환한다. 이는 예약된 이름이 아니지만, math.h에서 정의되어 있다. 심지어 math.h를 포함하지 않더라도, 컴파일러에 의해 기본 함수로 정의되어 있다.(아마도 사람들이 이를 전역 변수로 사용하는 것을 방지하기 위해서일 가능성이 높다).같은 전역 공간(global space)에서 이를 변수로 재정의(overriding)할 수 없다. 게다가, 짧은 이름의 변수를 전역 변수로 사용하는 것을 기대..
C++
for loop에서 const &auto의 사용for문을 사용하다보면 for(int i : res) 와 같은 문법을 사용할 때가 있다. 그런데 for(const auto& i : res) 문법도 있다. 둘의 차이는 값을 복사해서 넣는지, 참조만 하는지의 차이이다. 이 특성으로 인해 PS에서 시간초과가 날 수도 있다. ranged loopfor(int i : res) cout 위 for loop의 경우에는 res에서 i를 새로 만들어 값을 복사해서 넣는다. 그래서 i = 0과 같은 코드를 시행해도 원본은 바뀌지 않는다. 하지만 값을 복사하기 때문에 그 비용이 든다.for(auto& i : res) cout 위 for loop의 경우는 res의 값을 그대로 참조한다. 그래서 i = 0 명령을 내리면 값이 ..
vector.assign()과 vector.resize()의 차이resize()와 assign()의 차이는 주로 초기화 방식과 벡터의 동작에 있다.resize()는 벡터의 크기를 조정하지만, 기본값으로만 초기화 된다. resize(MAX_N)이라고 하면, 벡터는 MAX_N 크기로 변경되고 새로운 요소들은 0으로 초기화된다. 하지만 기존 요소들이 있다면 값을 변경하지 않고 그대로 남겨둔다.assign()은 벡터의 크기를 조정하면서 모든 요소를 새 값으로 덮어쓴다. assign(MAX_N, 0)을 하면 벡터의 모든 값을 0으로 설정하여 초기화하며, 이전에 남아있던 값들도 모두 덮어쓴다.따라서 assign은 벡터의 모든 요소를 특정 값으로 확실하게 덮었는 경우에 적합하고, resize는 크기만 조정할 때 사용..
소수점 고정 시 반올림 오류#include using namespace std;int main() { cout cout C++의 cout 객체와 precision 설정은 반올림 오차가 발생할 수 있는 방법으로 동작한다. 이는 숫자 내부 표현 방식과 관련이 있다. 실수는 이진 부동 소수점 형식으로 저장되기 때문에 10진수에서 정확하게 표현할 수 없는 경우가 생길 수 있다. 3.15는 3.1로 출력된다.이는 반올림 오차로 인해 3.149999... 와 같이 표현될 수 있고, 소수 첫째 자리까지 표시할 때 3.1로 반올림 된다.4.15는 4.2로 출력된다.이 경우 4.1500000... 과 같이 표현되어 소수 첫째 자리까지 표시할 때 4.2로 반올림 된다.부동 소수점 방식 오차부동 소수점 방식은 고정 소..
소수점 고정 출력cout C++에서는 숫자를 출력할 때 기본적으로 정수와 부동 소수점 형식을 제공한다. 부동 소수점 숫자를 출력할 때 과학적 표기법(ex: 1.23e+02)이나 일반 표기법을 사용할 수 있다. fixed 조작자는 부동 소수점 숫자를 고정 소수점 형식으로 출력하도록 지정한다. 사용법 fixed 조작자는 iostream 헤더에 정의되어 있으며 다음과 같이 사용할 수 있다.#include #include // setprecisionusing namespace std;int main() { double num = 123.456789; cout 기본 출력:기본적으로 cout은 부동 소수점 숫자를 출력할 때 가끔 과학적 표기법을 사용한다.fixed 사용cout 예를 들어, 123.4..
cin과 getline(), 그리고 cin.ignore()cin 객체 헤더파일에 포함된 입력 스트림 객체이다.공백, 탭, 엔텉와 같은 화이트 스페이스 문자를 무시하고 입력 받지만, 이 문자들은 버퍼에 그대로 남아있다는 점을 유의한다. #include using namespace std;int n;string s;int main() { cin >> n; cout > s; cout cin은 공백 이전까지만 입력을 받기 때문에, 공백을 포함해서 입력 받을 수 없다. 공백을 포함해서 입력을 받으려면 getline함수를 사용하면 된다. getline() getline()은 기본적으로 개행 문자 ('\n')를 줄의 끝으로 인식하고 개행 문자 직전까지 입력을 받는다. 만약 다른 종결 문자를 사용하고 싶다면, 이를 세..
참조와 복사의 차이int &ref = arr[0]; // 참조int copy = arr[0]; // 복사 참조 (Reference)참조(Reference) : int &ref는 ref가 arr[0]을 참조하도록 한다. 이는 ref가 arr[n]의 다른 이름이 되도록 한다. 따라서 ref를 수정하면 arr 배열의 값도 수정된다. 이는 실제 데이터에 대한 별칭을 제공하므로 메모리를 추가로 사용하지 않으며, 성능 측면에서 이점이 있을 수 있다 복사 (Copy)int copy라면 arr[n]의 값을 copy에 복사하게 된다. 이렇게 되면 copy와 arr[n]은 서로 다른 메모리 공간을 차지하게 되며, copy를 수정하더라도 arr[n]에는 영향을 미치지 않는다. 예시참조 사용#include using nam..
std::bad_alloc 알고리즘 문제를 해결하다가 위 오류를 마주하였다. 아마 vector에 너무 많은 경우를 집어 넣어서 생긴 것 같다. std::bad_alloc 오류는 일반적으로 힙 메모리가 부족할 때, 더 이상 메모리를 동적으로 할당할 수 없을 때 발생하는 현상이라고 한다. 일반적인 에러 원인은 할당된 메모리를 반납하지 않았거나, 잦은 힙 메모리 할당/삭제에 의한 메모리 단편화가 많이 발생되어 원하는 크기의 메모리를 할당할 수 없을 때 발생할 수 있다. 메모리 단편화는 시스템 성능에도 영향을 미칠 수 있으므로 될 수 있으면, 할당할 메모리의 크기가 작고 반복적으로 사용되는 경우에는 스택 메모리(배열 등)에 할당하여 사용하는 것이 좋다는 답변을 보았다. 메모리 관리를 잘해서 안마주치는 게 제일..
endl과 '\n'의 차이 endl은 개행뿐만 아니라 버퍼를 비워주는 역할도 하기 때문에 \n에 비해 속도가 느리고 시간 제한에 걸릴 가능성이 높다.. 따라서 별 다른 이유가 없는 한, \n를 사용하는 것이 좋을 것 같다. https://nodiemecarry.tistory.com/entry/%EB%B0%B1%EC%A4%80-11651%EB%B2%88-%EC%A2%8C%ED%91%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-2-C-%EC%BD%94%EB%93%9C [백준] 11651번 좌표 정렬하기 2 C++ 코드 코드 #include using namespace std; int n,x,y; vector v; bool cmp(pair a, pair b) { if(a.second..
자료형 변환 함수 1. string을 int형으로: stoi(string 변수); 2. int를 string으로: to_string(int 변수); to_string(a).find("666") 3. string을 char*로: string변수.c_str(); 4. char*을 int형으로: atoi(char* 변수); 5. char*를 string으로: 바로 할당해주면 됨 참고자료 https://comyoung.tistory.com/269