목록언어 (15)
No Rules Rules
코드에서 터미널 명령을 실행하는 경우, 흔히 system 함수를 사용하게 됩니다. 하지만 system 함수의 return은 정수이며 실행 결과에 대한 문자열은 읽어올 수 없습니다. 따라서 명령을 수행하고 그에 따른 결과 문자열은 popen을 통해 획득할 수 있습니다. _popen, _wpopen Microsoft C 런타임(CRT) 라이브러리 함수 및 _wpopen에 대한 참조입니다_popen. learn.microsoft.com std::string CIPSettingDlg::GetResultFromCommand(std::string cmd) { std::string result; FILE* fp(nullptr); const int maxBuffer = 256; char buffer[maxBuffer]..
현재 내 pc의 모든 랜카드 정보 (WiFi 포함) 를 읽기 위한 구문입니다. 복수의 랜카드 정보를 읽을 수 있으므로 어댑터 이름이나 아이피 정보 등을 읽기 위해 활용할 수 있습니다. ULONG flag(0); IP_ADAPTER_INFO adapter_info[50]{ 0 };// 랜카드(어댑터)는 최대 50개가 있다고 가정 PIP_ADAPTER_INFO tmp_adapter_info(nullptr); ULONG adater_info_size(0); PIP_ADDR_STRING addr_string(nullptr); std::vector lists // check buffer size flag = GetAdaptersInfo(nullptr, &adater_info_size);// 모든 어댑터 정보의 b..
STL map을 value 기준으로 sort 자료구조 map은 key값으로 정렬되어집니다. map의 원형을 보시면 다음과 같습니다. 정렬과 관련되어 주의깊게 보셔야 할점은 class _Pr = less 입니다. 기본적으로 map 라는 자료형 선언시, Predicate의 default 인자는 less가 됩니다. 그래서 오름차순으로 자동 정렬이 되는 것이구요. 만약 내림차순의 map을 사용하고 싶다면 greater로 설정하면 된다는 것이죠. 물론 오름차순도 내림차순도 아닌 특수한 정렬을 갖는 map을 생성하고 싶다면 직접 정의할 수도 있습니다. 하지만 원형에서 보듯이 _Kty 즉, key 로만 정렬되어질 수 있습니다. 따라서 key가 아닌 value로 정렬을 하고 싶다면 자료형을 선언하는 시점에는 할 수 없..
자료구조란? 자료구조(資料構造, data structure)는 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장을 의미한다. 더 정확히 말해, 자료 구조는 데이터 값의 모임, 또 데이터 간의 관계, 그리고 데이터에 적용할 수 있는 함수나 명령을 의미한다. 자료구조는 크게 선형구조 와 비선형구조, 단순구조 와 파일구조 로 나눌 수 있습니다. 여기서 단순구조와 파일구조는 생략하고 선형구조와 비선형구조 에 대해서 알아보겠습니다. 선형구조란? 선형구조란 자료를 구성하는 원소들은 순차적으로 나열시킨 형태를 의미한다. 방향에 따라 스택, 큐, 덱 등으로 나뉩니다. 비선형구조란? 하나의 자료 뒤에 여러개의 자료가 존재할 수 있는 형태를 의미한다. 트리의 구조가 대표적이라고 할 수 있습니다.
거품 정렬 또는 버블 정렬( - 整列, 영어: bubble sort, sinking sort)은 두 인접한 원소를 검사하여 정렬하는 방법이다. 시간 복잡도가 O(n^2) 로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용된다. 버블정렬은 두개의 값을 서로 비교하는 방식입니다. 단순하고 직관적이므로 실제로 구현에서 나도 모르게 사용하는 정렬입니다. 배열 4개가 있다고 가정해봅시다. 아래는 오름차순을 기준으로 기재하였습니다. 배열[0]과 배열[1]을 비교하여 작은 값은 앞에, 큰값은 뒤에 배치합니다. 배열[1]과 배열[2]를 비교하여 작은 값은 앞에, 큰값은 뒤에 배치합니다. 배열[2]과 배열[3]를 비교하여 작은 값은 앞에, 큰값은 뒤에 배치합니다. 따라서 배열[3]은 배열 4개 중 가장 큰 값입니다...
삽입 정렬(揷入整列, insertion sort)은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다. 삽입정렬은 현재의 인덱스값이 어느 인덱스에 삽입되어야 할지를 비교하며 이루어집니다. 선택정렬의 경우, 하나의 값을 기준으로 그보다 더 작은 (더 가장 작은) 인덱스를 찾고 두 인덱스의 값을 서로 swap 하는 방식입니다. 하지만 삽입정렬의 경우, 하나의 값을 기준으로 그보다 더 큰값이 존재한다면 큰값이 있는 인덱스를 뒤로 한칸씩 밀어나간다는 개념입니다. 즉, 선택정렬은 swap의 개념이지만 삽입정렬은 insert에 개념으로 접근됩니다. (배열은 insert라는 개념이 없으므로 한 칸씩 뒤로 미는 형태로 구현됩니다..
선택 정렬(選擇整列, selection sort)은 제자리 정렬 알고리즘의 하나로, 다음과 같은 순서로 이루어진다. 주어진 리스트 중에 최소값을 찾는다. 그 값을 맨 앞에 위치한 값과 교체한다(패스(pass)). 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다. 선택정렬은 가장 직관적인 정렬 방법입니다. 배열 10개가 있다고 가정해봅시다. 아래는 오름차순을 기준으로 기재하였습니다. 배열[0]을 기준으로 배열[1] ~ 배열[9] 중 최소값이 있는 인덱스를 찾습니다. 그리고 해당 인덱스의 값과 배열[0]의 값을 서로 swap 합니다. (찾은 인덱스가 없다면 배열[0]과 배열[0]을 서로 swap 할 수도 있고 swap 자체를 하지 않아도 됩니다.) 다음으로 배열[1]을 기준으로 배열[2] ~ 배열..
STL의 string을 다루다보면 특정 구분자를 통해 파싱이 필요한 경우가 있습니다. 필요할때마다 구글링을 해보면 하나의 구분자를 통해 파싱하는 경우가 많다보니 한번에 다수의 구분자를 통해 파싱을 하는 함수를 직접 구현하여 두고두고 쓰고자 정리합니다. template void stringtok(T& container, const std::string& in, const char* const delimiters = " \t\n") { std::size_t len = in.length(), i = 0, j = 0; while (i < len) { if ((i = in.find_first_not_of(delimiters, i)) == std::string::npos) break; if ((j = in.find..
코드 리뷰를 하거나 팀내 후배들에게 교육을 할때마다 항상 강조하는 말이 있습니다. 코드에 const를 덕지덕지 붙여라! 목적이 있는 변수나 함수를 선언할때는 특히나 더! 왜일까요? 별거 아닌거 같지만 const를 추천할까요? const는 여러 상황에서 사용 가능합니다만 일단 순서대로 얘기해보려고 합니다. 객체의 const 우리가 일반적으로 사용하는 일반 변수에서의 const는 다음과 같은 의미를 갖습니다. int main() { int value1 = 5; // value1이라는 녀석의 값은 5야 value1 = 6; // value1이라는 녀석을 6으로 바꿀래! const int value2 = 10; // value2라는 녀석의 값은 10이긴한데... // 초기식의 값으로 유지할꺼야! value2 =..
앞서 설명드렸던, 흔히들 알고 있는 for문은 다음과 같습니다. for(int idx = 0; idx < 10; ++idx) { ... } C++언어에서는 색다른 for문이 추가되었는데요. 그것은 for each문 입니다. int some_value[10]; for each(int value in some_value) { ... } 특이하게 생겼죠? for each문은 배열의 인자를 하나씩 받아옵니다. 즉, 위 for each문은 10번의 논리식을 수행하게 되고(some_value가 10개라서) 매회마다 value의 값이 변하게 됩니다.(some_value의 첫번째부터 마지막까지) 잠깐! 논리식의 기능에 따라 for each문의 단점(?)이 존재하는데요. 바로 증감식에서 사용된 변수 (첫 예제를 보자면 ..