프로그래밍 언어/C++
C++ 해시(Hash)의 의미 그리고 구현
3명의 사람 (김연아, 손흥민, 서장훈) 이 위와 같이 부탁을 했다. 그리고 이러한 기능을 C++ 를 사용해서 구현해달라고 했다. 파이썬과 다르게, 기본적으로 C++ 에서는 이런 기능을 지원하지 않는다. 어떻게 가장 효율적이고, 빠른 자료구조가 될 수 있을까? 답은, 각각의 이름(텍스트)에 대해서, 유일한 Key 값을 가지게 하는 것이다. 만들어진 Key 값을 이용해서 자료에 접근한다면 O(1) 시간만에 접근할 수 있다. 해시(Hash)의 동작원리 해시에서 Key를 생성하기 위한 다양한 알고리즘이 존재한다. MD-5나 SHA이 그 유명한 해시 알고리즘 중 하나이다. 우리는 학습을 목표로, 문자열을 통해서 간단한 해시를 만드는 방법을 알아본다. 'apple' 이라는 문자열이 주어졌다고 가정하고 Key를 만..
C++ 변수와 함수에서의 const
Const 의미 컴파일러 상수(*상수 : 정적인 data. 초기화를 한번밖에 못하는 data. 메모리 변경이 불가하다). 변수를 상수화하여, 한번 할당된 상수로 할당된 메모리의 모든 비트를 변경하지 못한다. Const의 장점 const키워드가 붙은 객체는 외부 변경을 불가능하게 한다. class 바깥에서는 전역 / namespace 유효범위의 상수를 정의하는데 씀. static 선언한 객체에도 const를 붙이는 것이 가능하다. 정적 / 비정적 data 멤버 모두를 상수로 선언할 수 있다. 변수에서의 Const int a = 10; int const *pn const int* pn = &n; -> 포인터가 가리키는 대상(값)이 상수. pn(주소)은 변경 가능하다, *pn(값)은 변경이 불가하다. int ..
C++ 난수 생성 std::random + 생성 시간 측정하는 std::chrono 라이브러리
#include #include int main() { // 시드값을 얻기 위한 random_device 생성. std::random_device rd; // random_device 를 통해 난수 생성 엔진을 초기화 한다. std::mt19937 gen(rd()); // 또는 미리 범위를 지정 할 수가 있음 // std::mt19937 gen(1234); // 0 부터 99 까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의. std::uniform_int_distribution dis(0, 99); for (int i = 0; i < 5; i++) { std::cout
C 난수 생성
C언어 프로그래밍에서 코드를 작성하다보면 무작위의 숫자가 필요한 경우가 존재한다. 보통 무작위 숫자를 난수라고 표현한다. C언어에서 난수를 표현하기 위해서는 stdlib.h 헤더파일에 포함되어있는 rand()라는 함수를 사용하면 된다. ☞ rand()함수 사용법 #include #include // rand() 함수 포함 라이브러리 int main() { int random = 0; // 정수형 변수 선언 for (int i = 0; i < 10; i++) { // 10번 반복 random = rand()%9; // 난수 생성 printf("%d\n", random); // 출력 } } 8번째 줄에 random = rand()%9; 라는 코드가 있다. 해석하면 rand() 함수에 의해 난수를 생성하고 그..
C++ 데이터 타입(data type)
1. 변수 선언하기 타입명을 적고 띄우고, 변수명을 적는다. 공백은 스페이스 탭등이 여러개 들어가도 된다. 콤마(,)로 구분하여 여러개를 한번에 선언할 수 있다. int a; int b, c, d; 2. 변수값 초기화 선언과 동시에 초기화 한다. int value = 0; 함수 호출 처럼 초기화 할 수 도 있다. int value(0); 여러개를 한번에 초기화 할 수도 있다. int a = b = c = 0; 콤마(,)로 분리해서 여러개를 초기화 할 수 도 있다. int a = 0, b = 1; 선언 후에 초기화 해도 된다. int a; a = 1; 3. 데이터 타입 C++에는 아주 많은 데이터 타입이 있다. C++ 언어의 데이터 타입이 가지는 저장공간은 컴파일러마다 다를 수 있다. 이 글은 Visual..
C++ std::tuple 여러가지 타입들의 객체를 보관 / Structured binding
#include #include #include int main() { std::tuple tp; tp = std::make_tuple(1, 3.14, "hi"); std::cout
std::variant와 std::monostate 여러가지 타입 중 한 가지의 객체를 보관
std::variant 는 one-of 를 구현한 클래스라고 보면 된다. 즉, 컴파일 타임에 정해진 여러가지 타입들 중에 한 가지 타입의 객체를 보관할 수 있는 클래스이다. 물론 공용체(union) 을 이용해서 해결할 수 도 있겠지만, 공용체가 현재 어떤 타입의 객체를 보관하고 있는지 알 수 없기 때문에 실제로 사용하기에는 매우 위험하다. // v 는 이제 int std::variant v = 1; // v 는 이제 std::string v = "abc"; // v는 이제 double v = 3.14; 먼저 variant 를 정의할 때 포함하고자 하는 타입들을 명시해줘야 한다. 위의 경우 정의한 variant 는 int, std::string, double 이 셋 중 하나의 타입을 가질 수 있다. var..
C extern (변수 / 함수 외부 선언)
const와 typedef는 기본적으로 내부 링크로 처리되고 여기서 extern을 붙이면 외부 링크가 적용된다. 어떤 이름을 extern으로 지정하면 컴파일러는 이를 정의가 아닌 선언문으로 처리한다. 변수를 extern으로 지정하면 컴파일러는 그 변수에 대해 메모리를 할당하지 않는다 따라서 그 변수를 정의하는 문장을 따로 작성해야 한다. /* AnotherFile.cpp */ extern int x; int x{ 3 }; extern으로 선언하는 동시에 초기화가 가능하다. /* AnotherFile.cpp */ extern int x = { 3 }; extern을 붙이지 않아도 x는 기본적으로 외부 링크로 처리되기 때문에 생략 해도 된다. extern이 반드시 필요한 경우는 다른 소스 파일에서 x에 접근..
C++ auto 타입 추론
auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정된다 (타입 추론(type inference)). 이 기능은 생성 시 변수를 초기화할 때만 작동한다. 아래는 int형 변수 a와 float형 변수 b의 합을 auto키워드를 통해 sum변수에 저장하고 출력한 것이다. #include using namespace std; int main() { int a = 5; float b = 3.5; auto sum = a + b; cout
C++ mutable
원래대로라면 const로 멤버 함수가 상수화되면 이 함수는 멤버 변수를 변경시키지 못한다. 그러나 멤버 변수가 mutable로 선언되어 있다면 상수화된 멤버 함수라도 멤버 변수 변경이 가능해진다. class AAA { mutable int val; public: void setValue(int _val) const { val = _val; } }; setValue는 상수화된 멤버 함수이므로 원래대로라면 멤버 변수 val을 변경할 수 없지만 val 이 mutable로 선언되었으므로 값 수정이 가능하다. 출처 : https://cpp11.tistory.com/35