C++
C++ 클래스 접근제한자 관련 보충 내용
클래스 접근제한자는 오브젝트 레벨이 아닌 클래스 레벨로 작동되기 때문에 생성자 내에서 파라미터로 받는 같은 클래스 변수의 private 또는 protected 멤버 변수에 접근이 가능하다. #include using namespace std; class A { private: int mValue = 0; public: A() = default; A(int val) : mValue(val) { } A(const A& a) { this->mValue = a.mValue; } void Print() { cout
C++ 객체 이동 std::move
에 정의됨 // C++ 14 이전에는 constexpr 아님! template constexpr typename std::remove_reference::type&& move(T&& t) noexcept; std::move 는 어떤 객체 t 가 이동 될 수 있음 을 알려준다. 이동 이라 하면 C++ 11 에 도입된 개념으로 t 가 가지고 있는 자원을 다른 객체에게 효율적으로 전달하는 것을 의미한다. std::move 된 객체를 함수에 전달한다면, 우측값 레퍼런스를 인자로 받는 함수(예를 들어서 이동 생성자, 이동 대입 연산자, vector 의 push_back 함수 같은 애들)가 오버로딩 되어서 선택된다. 참고로 우측값 레퍼런스 자체는 rvalue 가 아니라 lvalue 이기 때문에, 이동 생성자나 이동..
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
[실4] 3986 - 좋은 단어
#include #include #include using namespace std; int main() { int n, res = 0; cin >> n; while(n--) { string str; cin >> str; stack s; for (int i = 0; i < str.size(); i++) { if(!s.empty() && s.top()==str[i]) { s.pop(); continue; } s.push(str[i]); } if (s.empty()) res++; } cout
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에 접근..