본문 바로가기
코딩

[코딩] 코딩 테스트 시, 자주 사용되는 유용 API (C++)

by johnsnowblog 2022. 10. 1.
머릿말

코딩 테스트를 쳐본 사람은 알겠지만, 머리속으로는 해결방법 및 로직에 대해 이해가 되었고 심지어 말로 설명 할 수 도 있으나, 이를 코드로 작성 또는  API를 통해 실제 구현하는데 어려움을 느껴본적이 있을 것입니다. 

따라서, C++ 로 코딩 테스트를 보기로 하였다면 최소한 아래 API / 예제들은 충분히 익히고 가면 도움이 되겠다는 생각에 정리를 해보았습니다. (이미 정리 잘하신 분들의 사이트에서 많이 참고 하였음. 아래 Reference 사이트란 명기)

 

혹시라도 도움이 되셨다면 좋아요 / 댓글 부탁드리며, 만약 정정할 내용있더라도 댓글 부탁드립니다.

 

 

기본 틀
가장 기본틀
#include <iostream>
using namespace std;
int main(){
	cout << "hello" << endl;
    return 0;
}
클래스 포함 기본틀
#include <iostream>
using namespace std;

class MyCar{
private:
	// 멤버 변수
	int fuel = 10;
    bool power = false;

public:
	//생성자
    MyCar(){
    	this->fuel = 100;
        this->power = true;
    }
    
    //생성자 다중 정의
    MyCar(int n){
    	this->fuel = n;
        this->power = true;
    }

	//소멸자
    ~MyCar(){
    	cout<<"소멸되었습니다."<<endl;
    }

	// 메소드
	void go(){
    	this->fuel--;
    }
	
    void fuel_check(){
    	cout<< "연료 : "<< fuel<<endl;
    }

};

class MySuv : public MyCar { //MyCar 클래스 상속
	void go(){
    	this->fuel -=2;
    }
}

int main(){

	MyCar car = MyCar(); //단일 클래스 생성
    car.go();
    car.fuel_check();
    
    MyCar car[3]; //복수 클래스 생성
    for(int i=0; i<3 ; i++){
    	car[i] = MyCar(50); //클래스 생성자 호출
    }

	MySuv suv = MySuv(); //상속된 MySuv 클래스 생성
	suv.go();
    car.fuel_check();

	return 0;
}

 

 

 

STL 표준 C++ 라이브러리 개념 

  1. Container (컨테이너) : 객체들을 저장하는 객체 혹은 클래스 (vector, list, string, map 등)
     - Sequence Container (순차적 접근 데이터 집합): array, vector, string, deque, list 인 선형 방식의 컨테이너
     - Associate Container (키를 사용한 데이터 접근) : set, multiset, map, multimap 인 비선형 방식의 컨테이너
  2. Iterator (반복자) : 컨테이너에 저장된 요소를 순회하고 접근하는 객체 혹은 클래스 (추상화)
  3. lgorithm(알고리즘) : 데이터를 다루기 위한 일련의 함수 (find, short, search 등)
  4. Container Adaptor : stack, queue, priority_queue 등
  5. Allocator : 메모리의 할당과 해제를 해준 객체
  6. Function Object : 함수처럼 동작하는 객체로 Operator()연산자를 overloading한 객체

 

입출력

기본적인 API
#include <iostream>
#include <fstream> // 파일 입출력

int main(){
	
    /* 기본적인 입출력 함수 */
    string s;
	cin >> s; //cin 입력
    cout << s; //cout 출력
    
    /* 문자하나만 입력 */
    char ch;
    ch = cin.get();
    cout << ch;
    
    /* istream 라이브러리의 getline() - char 타입으로 접근 필요 */
    //콘솔 입출력 
    char ch_arr[100];
    cin.getline(ch_arr, 10);
    cout<<ch_arr;
    
    //파일 입출력
    ifstream ifs;
	ifs.open("fileinput.txt");
    ifs.getline(ch_arr, 100);
    cout<<ch_arr;
    ifs.close();
    
    /* string 라이브러리의 getline() - string 타입으로 접근 필요 */
    string s2;
    getline(cin, s2);
    cout<<s2;
    
    ifstream ifs;
    ifs.open(fileinput.txt");
    getline(ifs, s2);
    cout<<s2;
    
    return 0;
}

# 주의 사항

cin 경우 엔터 ('\n')를 무시하지 않고 잡으므로, 연속으로 cin을 받는 경우 다음 cin에 '\n'가 포함되므로, cin 이후 하기와 같이 버퍼를 비워주는 코드를 추가하자. (단, getline 만 쓰는 경우 앞 문자 하나가 지워지게 되므로 사용상 주의)

cin.ignore();

 

소수점 자리 표현
#include <iostream>
#include <cmath> //반올림/올림/내림 함수

using namespace std;
 
int main(void)
{
    int a = 10;
    int b = 3;
    
    /* 정수 포함 5 자리 까지 표현됨 */
    cout.precision(5);
    cout << a/(double)b <<endl; // 3.3333

    /* fixed 이후에는, 소수점만 10 자리 까지 표현됨 */
    cout << fixed;
    cout.precision(5);
    cout << a/(double)b << endl; // 3.33333

    // 다시 소수점 고정 표현 해제 (unsetf) 후 출력
    cout.unsetf(ios::fixed); 
    cout << a/(double)b <<endl; // 3.3333
  
    /* printf 이용한 소수점 표현 */
	  printf("%f \n",a/(double)b); // 3.333333
    printf("%.5f \n",a/(double)b); // 3.33333 

    /* 올림/반올림/내림 처리, 처리 원하는 자리수 만큼 곱하기 나누기 필요 */
    printf("%.5f\n", ceil(a/(double)b * 100000)/100000); //소수점 5번째 자리까지 올림 처리 
    printf("%.5f\n", round(a/(double)b * 100000)/100000); //소수점 5번째 자리까지 반올림 처리
    printf("%.5f\n", floor(a/(double)b * 100000)/100000); //소수점 5번째 자리까지 내림 처리
  
	return 0;    
}
Array 배열

배열 동적 할당
cin >> N;
int *arr = new int[N];
delete[] arr;
2차원 배열 동적 할당
cin << row << col;
int ** arr;
arr = new int* [row]
for (int i=0 ; i< row; i++){
	arr[i] = new int[col];
}
for (int i=0; i< row; i++)
	delete[] arr[i];
delete[] arr;

 

Vector 벡터

Vector 생성 / 출력
#include <vector>
vector<int> v;
cin>>n; //테스트 케이스 개수 n
for (int i=0;i<n;i++){ //벡터에 입력값추가
	cin>>a;
	v.push_back(a)
}
for (int i=0;i<v.size();i++){
	cout << v[i];
}
Vector 주요 API
/* 생성 */
vector<int> v; // int 타입을 요소로 가지는 벡터 v 선언
vector<int> v(n); //0으로 n개 생성
vector<int> v(n, x); // x로 n개 원소 생성

v.push_back(a) // 벡터 v의 맨뒤에 a추가
v.push_back() //벡터 v 맨뒤 요소 삭제

v[i] // 벡터 v의 i번째 요소 참조
v[i] = a // 벡터 v의 i번째 요소를 a로 변경 
v.size() //벡터 v의 크기 반환 (요소 개수만큼 사이즈 리턴)
v.resize(n) // 기본
v.begin() // v의 첫번째 요소 주소
v.end() // v의 마지막 요소 주소

v.erase(v.begin() + 3); //index 위치의 데이터 삭제
v.erase(v.begin() + 1, v.begin() + 5); // index 1 ~ 5까지의 데이터 삭제
2차원 Vector
Vector <vector<int>> v2; // 2차원 벡터 정의
Vector <int> v; 
for (int i=0;i<row ; i++){ // 2차원 벡터에 추가할 1차원 벡터
	v.push_back(0);
}
for (int i=0;i<col ; i++){ //2차원 벡터에 백터 추가
	v2.push_back(v);
}

Pair 

- 두 가지 자료형을 하나로 묶을수 있음

- 기본적으로 utility 헤더에 제공 되나, vector / alorithm 헤더파일에 포함되어있기도 하다.

- 첫번째 데이터는 first, 두번째 데이터는 secone로 접근

- make_pair(f,s)로 한번에 대입 가능

#include <iostream>
#include <vector>

using namespace std;
 
int main(){
	pair<int, char> p;
   	p.first = 10; //방법1
    p.second = 'a';
       
    p = make_pair(20,'b'); //방법2
	cout<<p.first << " " << p.second<<endl;

	return 0;
}

 

Vector pair

- pair 로 설정한 뒤 sorting 하면 둘 중 하나의  값에 따라 정렬 가능

vector <pair<int, int>> v; // pair vector 정의
cin >> N;
for (int i=0;i<N;i++){
	v.push_back(make_pair(i,i)); // make_pair(a,b)로 pair 를 만들어서 추가
}
for (int i=0;i<N;i++){ //
	cout << v[i].first << “ “ << v[i].second; //첫번째 요소, 두번째 요소 출력
}

 

Sort 정렬

Sort : Array 정렬 
#include <algorithm> // sort 사용하기 위한 라이브러리
int arr[5] = {1,5,3,9,2};

/* 오름 차순 */
sort(arr,arr+4); // 정렬할 첫주소, 마지막 주소, default 오름차순

/* 내림차순 */
bool comp(int a, int b){
	return a>b;
}
sort(arr,arr+4, comp); // 정렬할 첫주소, 마지막 주소, 비교함수

/* 내림차순 방법 2 */
sort(arr,arr+4,grearter<int>());

for(int i=0;i<5;i++){
	cout << arr[i];
}
Sort : Vector 정렬
vector <int>v = {2,5,7,1,6};

sort(v.begin(), v.end());//오름 차순

/* 내림차순 */
bool comp(int a, int b){
	return a>b;
}
sort(v.begin(), v.end(), comp); // 정렬할 첫주소, 마지막 주소, 비교함수

/* 내림차순 방법2 */
sort(v.begin(), v.end());//오름 차순 이후,
reverse(v.begin(), v.end());// 반대로 뒤집어서 내림차순으로 만들기

/*출력*/
for(int i=0; i<v.size(); i++){
	cout << v[i];
}

 

String 문자열

String 주요 API

- 주의사항 : c언어의 char*, char[] 문자열과 달리 string 클래스에는 문자열 끝에 \0이 없음 주의 

/* 생성 */
string str("HelloCplusplus"); //생성 방법1
string str = "helloCplusplus"; //생성 방법2

/* 기본 API */
str.at(index); // index 위치에 해당되는 문자 반환
str.front(); // 문자열 맨 앞 인자 반환
str.back(); // 문자열 맨 뒤 인자 반환
str.size(); // string 사이즈 반환 
str.length(); // string 길이를 반환, 일반적으로 size와 같음
str.empty(); // string 비어있는지 검사

/* 대소문자 */
toupper(str); //모두 대문자 변환
tolower(str); //모두 소문자 변환

/* 문자열 편집 & 복사 & 비교 */
str.c_str(); // C++  스타일이 string 문자을 C스타일의 문자열로 변경, C언어처럼 마지막에 \0이 붙게됨
str.substr(index, length); // string 을 index 부터 len 만큼 잘라서 반환
str.substr(index); // index 부터 끝까지의 문자열 반환
str.replace(index, length, str2); // index 번째부터 length 개를 str2 문자열로 대체
str.compare(str2); // str과 str2를 비교하여 같으면 0, 다르면 0이 아닌 값 반환 (사전순 느릴때 양수)
// str문자열의 index 부터 len 까지와 str2의 index2부터 len2까지 비교
str.compare(index,len,str2,index2,len2); 
// str 문자열의 index 기준 len 만큼 arr배열에 복사, 단 끝에서 \0없으므로 필요시 직접 추가
str.copy(arr, len, index); 

/*find*/
str.find(arr, index);// arr배열에서 index 위치 부터 str 찾음, 찾은 문자열 index반환
str.find(str, index);// str문자열에서 index 위치 부터 str 찾음, 찾은 문자열 index반환
str.find(str 또는 arr);// index 없이도 사용가능

/* push & pop */
str.push_back(c); // str문자열 끝에 c문자 추가
str.pop_back();// str 문자열 끝에 문자 하나 제거

swap(str1,str2);// string 교환하되 reference 를 교환에서 swap 처리
str1 += str2; // operator + 를 이용한 문자열 붙이기
String Iterator 반복자
str.begin(); // 문자열 첫번째 문자 가리키는 반복자 포인터 반환
str.end(); // 문자열 마지막 문자의 바로 다음을 가리키는 반복자 포인터 반환

/* 예시 */ 
for (string::iterator iter = str.begin() ; iter!=str.end(); ++iter){
	cout<<*iter << endl;
}
문자열 분리 예제 : substr / find 사용
#include <iostream>
#include <string>

using namespace std;

int main(){
	string str = "Hello,World,C++";
    string separator = ",";
    int cur_pos = 0;
    int pos;
    
    //find(separator, index)는 index 에서 separator 를 찾고 index를 반환, 없으면 npos반환
    while((pos=str.find(separator, cur_pos) !=string::npos){
		int len = pos - cur_pos;
        string result = str.substr(cur_pos, len); // cur_pos index에서 len까지 잘라서 result저장
        cout << result <<endl;
        cur_pos = pos + 1;
    }
    string result = str.substr(cur_pos);
    cout << result << endl;
}
문자열 분리 예제 2 : istringstream으로 변환 후 getline 함수 이용
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(){
	string str = "Hello,World,C++";
    char separator = ',';
    istringstream iss(str); // 문자열을 istringstream으로 변환
    string str_buf;
    
    //getline (istream& is, string& str, char delim) : delim 나올때까지 str에 저장
    while(getline(iss, str_buf, separator)){
    	cout << str_buf << endl;
    }
    return 0;
}
문자열 분리 예제 3 : token 함수 이용
#include <iostream>
#include <cstring> // C의 문자열 관련 함수 사용 목적

using namespace std;

int main(){
	char str[] = "I can do it!";
    char *token;
    
    // char* strtok(char* str, const char* delimiters);
    // 문자열에서 찾은 마지막 토큰 주소값을 리턴, 토큰 더이상 없다면 NULL 포인터 리턴
    token = strtok(str," ");
    while(token!=NULL){
    	cout << token << endl;
        // 기존에 첫번째 인자로 전달했던 문자열을 계속 토큰으로 분리해 나가고 싶다면 NULL 전달
        token = strtok(NULL, " ");
    }
    return 0;
}

 

문자열 공백 제거 (Trim처리)
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string WHITESPACE = " \n\r\t\f\v";

string ltrim(const string& s){
	size_t start = s.find_first_not_of(WHITESPACE);
    return (start == string::npos) ? "" : s.substr(start);
}

string rtrim(const string& s){
	size_t end = s.find_last_not_of(WHITESPACE);
    return (end == string::npos) ? "" : s.substr(0, end+1);
}

string trim(const string& s){
	return rtrim(ltrim(s));
}

int main(){
	string s = "\n\tHello World   \r\n";
    cout << "START:" << trim(s) << ":END"<<endl;
    return 0;
}
특정 문자열 찾기
#include <iostream>

using namespace std;

int main(){
	string line = "hello c++ world welcome world";
    string word = "wor";
    int pos = line.find(word);
    
    while(pos!=string::npos){
    	cout<<pos << " : " << line.substr(pos, word.size()) << endl;        
		pos = line.find(word, pos + word.size());
    }

	return 0;
}

 

Queue 큐

Queue 기본 API
#include <queue>

/* push (back 으로 데이터 추가), pop (front쪽으로 데이터 삭제) 방식 */ 
queue.push(element); //back 쪽으로 데이터 추가
queue.pop(); // front 데이터 삭제
queue.empty(); //비어있는지 확인
queue.back(); //마지막 데이터 반환 
queue.front(); //첫번째 데이터 반환
queue.size();

/* 예시 */
queue <int> que; // 큐선언
for (int i=0;i<5;i++){
	queue.push(i);
}
while(!que.empty()){
	cout<<que.front()<<endl; //요소 삭제 전 출력
    que.pop(); //요소 삭제
}

 

Stack 스택

Stack 기본 API
#include <stack>
stack<int> stack; // 스택 변수 생성
stack.push(element); //스택에 데이터 추가
stack.pop(); // 스택 데이터 삭제
stack.top(); // 스택 제일 위 데이터 반환
stack.size(); // 사이즈반환
stack.empty(); // 비어있는지 확인
swap(stack1, stack2);

/* 예제 */
#include <iostream>
#include <stack>
using namespace std;
int main(void){
	stack<int>st;
    stack<int>st2;
    
    st.push(1);
    st.push(2);
    st2.push(10);
    st2.push(20);
    swap(st,st2);
    
    while(!st.empty()){
    	cout << st.top() << endl;
        st.pop();
    }
    return 0;
}

 

List 리스트

list 기본 API
#include <list>

/* 생성자 API */
list lt; // list 컨테이너 생성
list lt(10); // default 0값으로 초기화 된 원소 10개 생성
list lt(3,2); // 2값으로 초기화된 원소 3개 생성
list lt2(lt1); //list lt1을 lt2로 복사

/* 멤버 변수 접근 API */
list lt;
lt.assign(3,4); // 4로 초기화된 3개의 원소를 할당
lt.front(); // 맨 앞 원소 반환
lt.back(); // 맨 뒤 원소 반환
lt.begin(); // 맨 앞 원소 가리키는 iterator 반환
lt.end(); // 맨 뒤 원소 가리키는 iterator 반환
	// ex) list<int>::iterator ter;
    // iter = lt.end();
lt.rbegin(); // 앞에서 부터 순차적 접근할 때 사용 
lt.rend(); // 뒤에서 부터 순차적 접근할 때 사용
lt.push_back(k); // 뒤쪽으로 원소 k 추가
lt.push_front(k); // 앞쪽으로 원소 k 추가
lt.pop_back(); // 맨 마지막 원소 제거
lt.pop_front(); // 맨 첫번째 원소 제거
lt.insert(iter, k); // iter가 가리키는 위치에 원소 k 삽입, 삽입 원소 가리키는 iterator 반환
lt.erase(iter); // iterator 가리키는 원소 삭제, 삭제한 원소 다음 가리키는 iterator 반환
lt.size(); // 원소 개수 반환
lt.remove(k); // k와 같은 원소를 모두 제거
lt.remove_if(predicate); // 단항 조건자 predicate 해당하는 원소 모두 제거
lt.reverse(); // 원소들의 순차열 뒤집음
lt.sort(); // 모든 원소를 default 오름차순 정렬
lt2.swap(lt1) // lt2와 lt1을 바꿈
lt2.splice(iter2, lt1); // lt2에서 iter2이 가리키는 곳에 lt1 모든 원소 잘라 붙임
lt2.splice(iter2, lt1, iter1); // lt2의 iter2에 lt1의 iter1가리키는 원소 붙임
lt2.spiice(iter2, lt1, iter1_1, iter1_2);// lt2 iter2에 lt1의 iter1_이상~iter1_2미만까지 붙임
lt.unique();//양옆의 원소가 같으면 유일하게 만듬.
lt2.merge(lt1); // lt1을 lt2내부로 합병 정렬, default 오름차순으로
list, remove 예제
#include <iostream>
#include <list>

using namespace std;

bool predicate(int num){
	return num>=100 && num<=200;
}
int main(void){
	list<int> lt;
    
    lt.push_back(10);    
    lt.push_back(108);    
    lt.push_back(60);    
    lt.push_back(10);    
    lt.push_back(100);    
    lt.push_back(40);       

	list<int>::iterator iter;
    
    lt.remove_if(predicate); // predicate 함수가 참이면 remove한다
    lt.remove(10); // 원소가 10이면 제거
    
    for(iter=lt.begin(); iter!=lt.end(); iter++){
    	cout << *iter << " ";
    }
    return 0;
}
list, unique / sort 예제
#include <iostream>
#include <list>
#include <functional>

using namespace std;

int main(void){
	list<string> lt;
    
    lt.push_back("b");
    lt.push_back("c");
    lt.push_back("a");
    lt.push_back("a");
    lt.push_back("q");
    lt.push_back("b");
    lt.push_back("a");
    lt.push_back("a");
    
    list<string>::iterator iter;
    lt.unique(); //인접한 동일 문자 제거
    lt.sort(); //오름차순 정렬
    lt.sort(greater<string>()); // 내림차순 정렬

	for(iter=lt.begin(); iter!=lt.end() ; iter++){
    	cout << *iter << " ";
    }
    return 0;
}

 

형변환

문자 - 숫자 형변환
#include <iostream>
#include <string>

using namespace std;

int main(){
	// 1. 문자열 string -> 숫자 int
	string s = "1234";
	cout << stoi(s) <<endl; // 1234
	
	// 2. 숫자 int -> 문자열 string
	int num = 4567;
	cout << to_string(num) << endl; // "4567"
	
	// 3. 문자 char -> 숫자 int
	char ch2 = '9';
	cout << ch2 - '0' << endl; // 9
	
	// 4. 숫자 int -> 문자 char
	int num2 = 9;
    cout << (char)('0' + num2) << endl; // '9'
    
    // 5. char -> string
    char cst[100];
    char *cst = "hello";
    string str1 = cst; //방법 1
    string str2(cst); //방법 2
       
    //6. string -> char
    char cst[100];
    string str = "hello";
    strcpy(cst, str.c_str());
    
	return 0;
}

 

Map 맵 컨테이너

- 파이썬의 딕셔너리 타입과 동일한 개념. Key오 Value로 이루어져 있으며 Pair 객체로 저장됨.

- key는 고유한 값이므로 중복 불가능

- 삽입이 되면서 자동으로 정렬

- 노드 기반으로 이루어져 있고, 균형 이진 트리 구조

기본 API 사용 예제
#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{
	map<int, string> my_map;
    
    my_map[0] = "zero"; //추가 방법1
    my_map.insert(pair<int,string>(1,"one")); //추가 방법2
    my_map.insert(make_pair(2,"two")); //추가 방법3
    
    for(auto it=my_map.begin() ; it!=my_map.end() ; it++){
    	cout<< it->first <<"," <<it->second <<endl; //key,value 출력
    }
  
  	my_map.erase(0); // key 0 삭제
    my_map.erase(my_map.find(1)); // key 1 찾아서 삭제
  	
    cout<< "0 개수 count : " << my_map.count(0) <<endl;
    
    my_map.clear(); // map 데이터 전체 삭제
    
    if(my_map.empty())
    	cout << "empty!"<< endl;
  
  	return 0;
}

 

Hash Map 해시 맵 컨테이너 - 비권장

- 해시 테이블을 자료구죠로 사용있으며, 많은 자료를 저장 하고 있어도 검색이 빠름. 단 자료가 작을대는 메모리 낭비.

- 사용방법은 map과 거의 유사

- hash_map은 비표준 (namespace가 stdext)이고 일부 코딩테스트 사이트에서 동작 하지 않음.

- 성능도 더 우월하고 표준인 unordered_map 사용을 권장 (namespace가 std)

기본 API 사용예제
#include <hash_map>
#include <iostream>

using namespace stdext;
using namespace std;

int main(){
	hash_map<int, float> my_hash; //선언
	my_hash.insert(hash_map<int, float>::value_type(10, 45.6f)); // 단순 추가
 	my_hash.insert(my_hash.begin(), hash_map<int, float>::value_type(11,50.2f)); //특정위치 추가
 
 	my_hash.erase(my_hash.begin()); // 첫번째 위치 요소 삭제
    my_hash.erase(my_hash.begin(), my_hash.end()); // 처음~마지막 삭제
    my_hash.erase(11);  // key가 11인 요소 삭제
    
    //key 10인 iter를 찾아서 반환, 못찾으면 end 반환
    hash_map<int, float>::iterator iter = my_hash.find(10);
 	if(iter != my_hash.end())
    	iter->second = 290.44f; // 해당 key iter로 접근해 value 변경
    
 	return 0;
}

 

unordered_map 비정렬 맵 컨테이너 - Hashmap 대체

- 중복 허용하지 않고 정렬 없이 저장. 해시 테이블 저장과 같은 Hashmap과 유사.

기본 API 예제
#include <unordered_map>

using namespace std;

int main(){
	unordered_map<string, int> um;
    
    um.insert(make_pair("key",1); //추가 방법1
    um["banana"] = 2; //추가 방법2
    um.insert({"melon",3}); //추가 방법3
    
    cout<<um.size()<<endl;
    cout<<um.empty()<<endl;
    
    // pair<string,int> 대신 auto 사용해도 무방
    for(pair<string,int> elem ; um){
    	cout<< elem.first << " : " << elem.second <<endl;
    }
    
    //특정키 찾아서 지우기
    if(um.find("banana")!=um.end()){ 
    	um.erase("banana");
    }

	return 0;
}

 

Multimap 멀티맵 컨테이너 - 중복 허용

- 기존  map과의 가장 큰 차이점은 이름에서도 알 수 있듯이, key값 중복이 가능하다는 점.

- 정렬되면서 추가 

기본 API 예제
#include <iostream>
#include <map>

using namespace std;

int main(){
	multimap<int, int> mm;
    
  mm.insert({60,6});
  mm.insert({60,10});
  mm.insert({20,10});
    
  multimap<int,int>::iterator iter;

  //60 key 찾아서 지우기
  iter = mm.find(60); 
  mm.erase(iter);

  //20 key 찾아서, value 값 증가시키기
  iter = mm.find(20);
  iter->second++;
   
  for(iter = mm.begin() ; iter!=mm.end(); iter++){
  	cout << iter->first << " : " << iter->second <<endl;
  }

	// 나머지 사용 방법은 기존 map 과 동일하므로 생략

	return 0;
}

 

다수 value 생성하기 by vector
#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

int main(){
	multimap<string, vector<int>> mm;
  vector<int> v;

  v.push_back(1);
  v.push_back(2);
  
  mm.insert({"a",v});
  mm.insert({"b",v});
    
  multimap<string,vector<int>>::iterator iter;
   
  for(iter = mm.begin() ; iter!=mm.end(); iter++){
  	cout << iter->first << " : " << iter->second[0] << " " << iter->second[1] <<endl;
  }
  
	return 0;
}

 

 

set 셋 컨테이너

- Key라 불리는 원소들의 집합, key 값 중복 허용 안됨

- 원소는 자동으로 정렬됨. Default 는 오름 차순.

- 노드기반 컨테이너이며, 균형 이진트리

기본 API 예제
#include <iostream>
#include <set>

using namespace std;

int main(){
	set <int> s;
    
    s.insert(40);
    s.insert(10);
    s.insert(80);
    s.insert(50);
    s.insert(10); //중복 값 넣어도, 하나만 존재
    
    set<int>::iterator iter;
    for(iter=s.begin(); iter!= s.end(); iter++){
    	cout<<*iter << endl;
    }
    
    iter = s.find(30); // 특정 원소 찾기, 없다면 end() iter 리턴
    if(iter!= s.end()){
    	cout<< *iter << " 값 있음!"<<endl;
    }
	
    return 0;
}

 

 

 

# 주의 사항

  • 코드 상, 자주 등장하는 기본 코드 / 라이브러리 include 구문 생략하였으므로 그대로 복붙하면 동작 하지 않습니다.

 

# Reference 사이트

 

 

 

 

 

 

'코딩' 카테고리의 다른 글

[코딩] 컴파일 / Makefile  (0) 2022.11.18
[코딩] 기본 문제  (0) 2022.11.18