Corgi Dog Bark

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Map 을 Vector 로 변환하기
    뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 10. 20. 17:09
    반응형

    0. Map을 Vector로 변환하기


    Map을 Vector 자료형으로 변환할 일이 있었는데, 여러 가지 방법이 존재하여, 글로 남겨놓습니다. C++에서 Map 은 정렬되어 있는 컨테이너로써, Key-Value 쌍으로 이뤄져 있습니다. 이때, Key 들은 Compare 될 수 있는 값들에 의해 정렬되어 있고, Bidirectional 반복자를 가집니다.

     

     

     

     

     

    1. Map 구조체  Vector로 변환하기 


    변환하는 방법에는 여러가지가 존재하지만, 대표적인 것 몇 가지만 알아보겠습니다.

    1. Vector 생성자 이용하기
    2. Copy 알고리즘 이용하기
    3. Transform 알고리즘 이용하기
    4. 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 

    1. https://stackoverflow.com/questions/771453/copy-map-values-to-vector-in-stl
    반응형

    댓글

Designed by Tistory.