프로그래밍 언어/C++
[C++] vector (벡터) 복사하기
반복자#include #include using namespace std;void printVector(const vector v) { cout vect1{1, 2, 3, 4}; vector vect2; for (int i = 0; i 출력Old vector elements are : 1 2 3 4 New vector elements are : 1 2 3 4 The first element of old vector is :2The first element of new vector is :1할당 연산자 =(Assignment Operator =)#include #include using namespace std;void printVector(const vector v) { ..
[C/C++] 부동소수점의 비교연산 안되는 이유 및 오차범위 해결하기
int i = 0;double d = 0.f;while (i++ 사실 C++에선 다 자르고 출력하기 때문에 파악하기가 쉽지 않다 아래와 같이 작성해주면 쉽게 파악 할 수가 있다 따라서if (d == 1.0) 를 해주면 false가 나오는 이유다int main(){ int i = 0; double d = 0.f; while (i++ 이녀석만큼 빼주면 된다int main(){ int i = 0; double d = 0.f; while (i++
[C++] 구조체 바이트 패딩 규칙 코드 (structure byte padding or align rule)
1. Unless overridden with __declspec(align(#)), the alignment of a scalar structure member is the minimum of its size and the current packing."__declspec(align(#))을 오버라이드 하지 않으면, 스칼라 구조체(long, bool과 같은 일반 변수로만 이루어진 구조체)의 멤버는 변수의 사이즈와 현재 지정된 byte padding align을 따른다." bool과 long으로만 이루어진 각 구조체의 사이즈는 1 byte, 4 byte와 같이 각각의 멤버 사이즈대로 align 되었다.struct Size_1_Align{ bool b;};struct Size_4_Alig..
C++ 23 추가된 주요 기능들
1. if consteval - if constexpr의 consteval 버전이 생긴다. 2. Deducing this - 이제 클래스에서 똑같은 함수를 non-const, const 버전으로 두 가지를 만드느라 생기는 중복코드가 대폭 간결해진다. 3. auto(x), auto{x} - 함수 파라미터에서 rvalue (정확히는 prvalue)로 카피해 전달해주는 기능이다. 예제) 벡터에서 첫 원소와 똑같은 원소를 다 지우고 싶을 때 auto elem = v.front(); std::erase(v.begin(), v.end(), elem); 이 때 auto elem = v.front(); 에서 무조건 복사가 생긴다. C++ 23부터는 std::erase(v.begin(), v.end(), auto(v.f..
[C] 키 입력받는 함수 GetAsyncKeyState, GetKeyState
GetAsyncKeyState SHORT GetAsyncKeyState(int vKey) 반환값은 SHORT형이고, 첫번째 인수로는 가상 키코드가 오며, 우리가 만약 VK_UP을 넘겨주면, 방향키 중 위를 가르키는 키가 눌려있나 눌려있지 않나 확인할 수 있다. (키가 눌려진 상태에서는 최상위 비트(0x8000)이 1이 되며, 처음 입력되었을 때는 0x8001 비트가 1이 된다.) 가상 키코드 모음 반환값은 아래와같이 4가지로 나뉜다. 이전에 누른 적이 없고 호출 시점에서 눌린 상태, 즉 키가 눌려진 시점에서 0x8000을 반환한다. 만약 이전에도 누른 적이 있고 호출 시점에서도 눌렸으면 0x8001을 반환한다. 이전에 키를 눌렀으면 0x0001을 반환하고, 눌리지 않았다면 0x0000을 반환한다. Get..
[C++] inline (인라인) 함수란
inline 함수는 C++의 실행 속도 개선을 위해 등장 했다. C++에서는 기본적으로 클래스 선언을 통한 맴버함수가 많이 이용되는데, 이러한 경우 보통 간단한 기능을 하는 함수들이 많이 만들어지게 된다. 예) 생성자, getter(), setter(), print() 등 과같은 간단한 함수. 함수들이 간결하여 실행속도에 영향을 끼지지 않을 것 같지만 함수 호출 과정에서 프로그램 속도가 떨어지게 된다. 함수의 호출은 다음과 같이 진행된다. #include int fnc_1(int a, int b){ //매개변수 스택에 저장 return a + b; //리턴 값을 임시 저장소에 저장. } int main(void){ int num; num = fnc_1(5,1); //함수 호출 시점, 이곳의 주소값을 스택..
[C++] 입출력 개요
* 표준 입출력 스트림의 계층도 - iostream 계층도 cout은 basic_ostream에 속해 있으며, cin은 basic_istream에 속해 있다. - 표준 출력 객체 cout cout은 Console Output의 약어로 콘솔 출력을 의미한다. cout은 클래스가 아닌 객체다. cerr과 clog는 오류 출력과 디버깅 출력을 위한 것인데 기본적으로 모니터에 출력한다. - 기본 출력과 endl 기본적인 출력 방법이다. cout은
[C++] Iterator (반복자)
개념 C++ 라이브러리는 반복자를 제공하는데 이것을 사용하면 라이브러리의 방식대로 자료구조를 액세스 할 수 있다. 따라서 라이브러리가 효과적으로 동작한다는 것을 보장 할 수 있다는 장점이 있다. 즉, 포인터와 상당히 비슷하며, 컨테이너에 저장되어 있는 원소들을 참조할 때 사용한다. 추상적으로 말하자면, 반복자란 컨테이너에 저장되어 있는 모든 원소들을 전체적으로 훑어 나갈 때 사용하는, 일종의 포인터와 비슷한 객체라고 할 수 있다. 알고리즘 마다 각기 다른 방식으로 컨테이너를 훑어가기 때문에, 반복자에도 여러가지 종류가 있게 된다. 성질 - 컨테이너와 컨테이너 안의 있는 요소를 구별 - 요소의 값 확인 - 컨테이너 안에 있는 요소들 간에 이동할 수 있는 연산 제공 - 컨테이너가 효과적으로 처리할 수 있는 ..
[C++] iterator (반복자) vector와 list의 비교
개념 어떤 컨테이너(자료구조)에 접근하든 동일한 방법으로 접근하기 위해서 제공되는 객체. 반복자는 원소의 위치를 갖고 있는 포인터와 비슷한 형태이다. 반복자를 이해하기 위해 먼저 벡터와 리스트의 접근 방식을 비교해보자. 벡터는 배열 기반으므로 연속된 메모리 공간을 가지고 있다. 그래서 인덱스 연산으로 임의 접근이 가능하고, 인덱스에 넣은 값을 증가시키는 방식으로 순회도 가능하다. 모든 컨테이너에 이런 간단한 방식으로 접근이 가능하다면 반복자는 필요하지 않을 것이다. 하지만 컨테이너들마다 접근 방식이 다르다. 하지만 리스트는 우선 연속된 메모리 공간을 가지지 않기 때문에 벡터처럼 인덱스 로 접근하는 것이 불가능하다. 즉 다른 방법으로 순회를 해야 한다. 리스트는 현재 가리키고 있는 노드와 다음 노드의 주소..
[C++] map value sort - 맵 값 정렬
Map 컨테이너에서 처음 선언하는 방식의 따라 Key 기준으로 오름차순, 내림차순을 지정할 수 있지만 만약 Key가 아닌 Value를 비교하여 정렬을 하고 싶을 경우라던지 단순히 오름차순, 내림차순이 아닌 특정 조건에 의하여 정렬을 하고 싶을 경우 Map을 Vector로 변환한다음 Vector에서 정렬을 하던것처럼 해주면 된다. #include #include #include #include using namespace std; typedef pair ii; int main() { map map; map[5] = 20; map[2] = 50; map[3] = 10; map[4] = 40; map[1] = 30; map[6] = 60; for (auto it : map) { cout