프로그래밍 언어/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
[C++] string > int 변환 (개인 작성)
class MyString { string str; public: MyString() = default; MyString(string str) : str(str) { cout
[C] 문자열에서 특정 문자 변경, 제거 그리고 중복 제거
// 문자열에서 a 문자를 b 문자로 변경 // @param str 문자열 // @param cmp 바꾸고자 하는 문자 // @param rep 대체 문자 void ReplaceCharacter(char* str, char cmp, char rep) { if (str[0] == '\0') return; if (str[0] == cmp) str[0] = rep; ReplaceCharacter(str + 1, cmp, rep); } // 문자열에서 특정 문자를 제거 // @param str 문자열 // @param cmp 삭제하고자 하는 문자 void RemoveCharacter(char* str, char cmp) { if (str[0] == '\0') return; // 한 칸 씩 땡김 if (str[0..
[C] 함수의 포인터 / 배열 매개변수
함수의 매개변수로 배열 사용법 배열을 함수의 전달 인자로 사용하려면 배열의 변수명은 첫 번째 원소의 주소값이기 때문에 매개변수의 타입은 포인터가 되어야 한다. void 함수명(int* arr) { } 둘 다 동일한 의미를 지닌다 void 함수명(int* arr) { } void 함수명(int arr[]) { } #include #define Size 10 void Arrprint(int *Arr); void Arrprint2(int Arr[]); int main () { int i_arr[Size] = {1,2,3,4,5,6,7,8,9,10}; Arrprint(i_arr); Arrprint2(i_arr); return 0; } void Arrprint(int *Arr){ for(int i = 0; i
[C++] atoi (char > int 형변환) / stoi (string > int 형변환) 함수 구현
음수 표기하고자 하면 첫번째 원소가 - 와야됨. int Atoi(char* str) { int sign = 1, data = 0; char cur = *str; if (cur == '\n') return 0; if (cur == '-') sign = -1; while (cur != '\0') { cur = *str++; if (cur >= '0' && cur = '0' && cur
[C++] 범위 (Scope)
블록 범위 (Block Scope) 객체의 잠재적인 범위는 블록내 선언 된 지점에서 시작하여 블록의 끝에서 끝난다. 중첩된 블럭내 상위 블럭에서 선언 된 것과 동일한 이름으로 선언하는 경우 상위에서 선언 된 것은 무시되고 블럭내 선언 된 것이 사용된다. 이런 방법은 지양해야 하며 다른 이름을 사용한다. int main() { int a = 0; // scope of the first 'a' begins ++a; // the name 'a' is in scope and refers to the first 'a' { int a = 1; // scope of the second 'a' begins // scope of the first 'a' is interrupted a = 42; // 'a' is in s..

[C++] string 타입 문자열을 Split (분할)하기
Java에서는 문자열을 특정 구분자를 이용하여 여러 부분으로 나누는 함수 split을 제공한다. 또한 C의 경우 strtok라는 함수를 이용하여 char배열 형태의 문자열을 구분자를 기준으로 나눌 수 있다. 그러나 strtok의 경우 string타입의 문자열은 지원하지 않는다. C++에서는 istringstream이라는 문자열에서 작동하는 스트림 클래스가 있다. 이는 sstream이라는 C++ 표준 라이브러리를 추가해주어야 사용가능하다. istringstream는 istream을 상속받기 때문에 getline함수를 사용할 수 있다. getline 함수 : istream& getline(istream& is, string& str, char delim); getline함수를 이용하여 구분자별로 잘라서 ve..
[C++] 배열을 함수의 매개변수로 사용 시 주의점
Main함수로부터 scores[5] 배열을 넘겨받아 배열의 원소를 출력하는 PrintScore 함수를 살펴보자. void PrintScore(int scores[5], int size) { cout