-
Map 을 Vector 로 변환하기뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 10. 20. 17:09반응형
0. Map을 Vector로 변환하기
Map을 Vector 자료형으로 변환할 일이 있었는데, 여러 가지 방법이 존재하여, 글로 남겨놓습니다. C++에서 Map 은 정렬되어 있는 컨테이너로써, Key-Value 쌍으로 이뤄져 있습니다. 이때, Key 들은 Compare 될 수 있는 값들에 의해 정렬되어 있고, Bidirectional 반복자를 가집니다.
1. Map 구조체 Vector로 변환하기
변환하는 방법에는 여러가지가 존재하지만, 대표적인 것 몇 가지만 알아보겠습니다.
- Vector 생성자 이용하기
- Copy 알고리즘 이용하기
- Transform 알고리즘 이용하기
- ForEach 알고리즘 이용하기
방법 등이 존재합니다. 1 번은 Map의 반복자가 Pair < >인 점을 활용하여, Vector 생성자에 반복자 생성자를 넣어주었습니다. 나머지 방법들은 std::algorithm에 있는 방법을 사용하여, 예시를 들었습니다.
#include <iostream> #include <map> #include <string> #include <algorithm> #include <vector> using namespace std; void print(vector<pair<int,string>> &arr) { for(auto &c : arr) { cout << c.first << " " << c.second << endl; } cout << endl; } // # 1. vector 생성자를 이용하기. vector<pair<int,string>> ConvertVer1(map<int,string> &arr) { vector<pair<int,string>> tmp(arr.begin(), arr.end()); return tmp; } // # 2. copy 알고리즘 이용하기. vector<pair<int,string>> ConvertVer2(map<int,string> &arr) { vector<pair<int,string>> tmp; copy(arr.begin(), arr.end(), back_inserter(tmp)); return tmp; } // # 3. transform 알고리즘 이용하기. vector<pair<int,string>> ConvertVer3(map<int,string> &arr) { vector<pair<int,string>> tmp; transform(arr.begin(), arr.end(), back_inserter(tmp), [](auto &c) {return c;}); return tmp; } // # 4. for_each 알고리즘 이용하기. vector<pair<int,string>> ConvertVer4(map<int,string> &arr) { vector<pair<int,string>> tmp; for_each(arr.begin(), arr.end(), [&tmp](auto &c) {tmp.push_back(c);}); return tmp; } int main() { map<int,string> arr{{1,"a"},{2,"b"},{3,"c"},{4,"d"}}; /*--------- version 1 ---------*/ cout << "--------- version 1 ---------\n"; auto ver1 = ConvertVer1(arr); print(ver1); /*--------- version 2 ---------*/ cout << "--------- version 2 ---------\n"; auto ver2 = ConvertVer2(arr); print(ver2); /*--------- version 3 ---------*/ cout << "--------- version 3 ---------\n"; auto ver3 = ConvertVer3(arr); print(ver3); /*--------- version 4 ---------*/ cout << "--------- version 4 ---------\n"; auto ver4 = ConvertVer4(arr); print(ver4); return 0; }
2. Map 에서 Key 값 빼내기
Map에서 Key 값만을 분리하기 위해서는 for 문으로 반복 및 Transform 알고리즘으로 접근해주었습니다.
#include <iostream> #include <map> #include <string> #include <algorithm> #include <vector> using namespace std; void print(vector<int> &arr) { for(auto c : arr) { cout << c << " "; } cout << endl; } // # 1. vector 생성자를 이용하기. vector<int> ConvertVer1(map<int,string> &arr) { vector<int> tmp; for(auto &c: arr) { tmp.push_back(c.first); } return tmp; } // # 2. transform 알고리즘 이용하기. vector<int> ConvertVer2(map<int,string> &arr) { vector<int> tmp; transform(arr.begin(), arr.end(), back_inserter(tmp), [](auto &c) {return c.first;}); return tmp; } int main() { map<int,string> arr{{1,"a"},{2,"b"},{3,"c"},{4,"d"}}; /*--------- version 1 ---------*/ cout << "--------- version 1 ---------\n"; auto ver1 = ConvertVer1(arr); print(ver1); /*--------- version 2 ---------*/ cout << "--------- version 2 ---------\n"; auto ver2 = ConvertVer2(arr); print(ver2); return 0; }
3. Map 에서 Value 값만 빼주기
위의 2번과 비슷하지만 For_Each 알고리즘의 Template 버전을 추가했습니다.
#include <iostream> #include <map> #include <string> #include <algorithm> #include <vector> using namespace std; void print(vector<string> &arr) { for(auto c : arr) { cout << c << " "; } cout << endl; } // # 1. vector 생성자를 이용하기. vector<string> ConvertVer1(map<int,string> &arr) { vector<string> tmp; for(auto &c: arr) { tmp.push_back(c.second); } return tmp; } // # 2. transform 알고리즘 이용하기. vector<string> ConvertVer2(map<int,string> &arr) { vector<string> tmp; transform(arr.begin(), arr.end(), back_inserter(tmp), [](auto &c) {return c.second;}); return tmp; } // # 3. Template 화 ForEach 버전 template<typename T, typename V> vector<V> ConvertVer3(map<T,V> &arr) { vector<V> tmp; for_each(arr.begin(), arr.end(), [&tmp](auto &c){tmp.push_back(c.second);}); return tmp; } int main() { map<int,string> arr{{1,"a"},{2,"b"},{3,"c"},{4,"d"}}; /*--------- version 1 ---------*/ cout << "--------- version 1 ---------\n"; auto ver1 = ConvertVer1(arr); print(ver1); /*--------- version 2 ---------*/ cout << "--------- version 2 ---------\n"; auto ver2 = ConvertVer2(arr); print(ver2); /*--------- version 3 ---------*/ cout << "--------- version 3 ---------\n"; auto ver3 = ConvertVer3(arr); print(ver3); return 0; }
- Reference
반응형'뜯고 또 뜯어보는 컴퓨터 > 씨쁠쁠 C++' 카테고리의 다른 글
Shared_ptr 내부 구조 & 주의점 (0) 2022.10.26 가상 소멸자 / 가상 소멸자 사용 이유 (0) 2022.10.26 [C++] String to Int, Float, Double 자료형 / stoi, stol, stoll (0) 2022.10.26 스마트 포인터 : Unique_ptr (0) 2022.05.08 [C 언어] 형변환 _ 구조체 형변환 (0) 2022.01.22