반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

C++ STL컨테이너 구조 - list,multimap 본문

C++

C++ STL컨테이너 구조 - list,multimap

huiung 2019. 1. 14. 15:28
반응형

저는 평범한 대학생입니다. 잘못된 부분이 있다면 알려주시면 확인 후 바로 수정하겠습니다.

 

오늘은 C++의 STL 컨테이너 구조중 list와 multimap 에 대해서 알아 보겠습니다.

 

  • 1.list

-list 컨테이너는 Double linked list인 이중 연결 리스트로 구현 되어 있습니다.

 

-<list> 헤더파일을 추가하면 사용이 가능합니다.

 

- 기본적인 연산들은 vector와 비슷하지만 list 구조는 양방향으로 삽입 삭제가 가능합니다.

 

- list는 각각이 포인터로 연결되어 있어 at이나,[] 사용이 불가능하고 iterator를 통한 방식으로만 접근이 가능합니다.

 

- list는 기본적으로 array와 달리 삽입과 삭제에 있어서 굉장히 효율적입니다. 따라서 그러한 작업이 많이 존재 할 때 사용하시면 좋습니다.

 

-연산

 

  • assign(num,element) 

 n개의 element를 할당합니다.

  • front(), back() 

각각 가장 앞과 맨 뒤의 원소를 반환합니다. 

  • begin(), end()

각각 가장 앞과 맨 뒤의 iterator를 반환합니다. 

  • push_back(element), push_front(element)

각각 맨 끝과 맨 앞에 element를 삽입합니다. 

  • pop_back() , pop_front() 

각각 맨 끝과 맨 앞에 있는 원소를 제거합니다. 

  • insert(iter, element)

iter가 가리키는 위치에 원소를 삽입하고 

이 원소를 가리키는 iterator를 반환합니다 

  • erase(iter) 

iter가 가리키는 위치의 원소를 제거하고

제거한 원소의 다음 원소를 가리키는 iterator를 반환합니다. 

  • size()

list의 크기를 반환합니다. 

  • remove(element) , remove_if(조건)

remove는 원소가 element인 것을 모두 제거합니다.

remove_if는 조건에 해당되는 모든 원소를 제거합니다.

 

추가적인 연산은 아래의 사이트를 참고해 주세요.

http://www.cplusplus.com/reference/list/list/?kw=list

 

다음은 테스트 코드입니다.

 

 #include <iostream>
#include <list>

using namespace std;

int main(void) {
	list<int> l;
	
	l.assign(3,4);
	l.push_back(5);
	l.push_front(6); // 6 4 4 4 5 순서로 삽입 
	
	cout<<l.front()<<endl; //6 출력 
	cout<<l.back()<<endl; // 5 출력 
	
	l.pop_back(); // 5 제거 
	l.pop_front(); // 6 제거 
	
	// 리스트 : 4 4 4 
	
	cout<<l.front()<<endl; //4출력 
	cout<<l.back()<<endl; //4출력 
	
	auto it = l.begin();
	++it; //두번째 위치 
	it = l.insert(it, 8); //두번째 위치에 8 삽입 
	
	//리스트 : 4 8 4 4 
	
	for(auto n: l)
		cout<<n<<" ";
		cout<<endl;
	it = l.erase(it); //두번째 위치 값 제거 
	
	//리스트 : 4 4 4 
	
	for(auto n: l)
		cout<<n<<" ";
		cout<<endl;
		
	cout<<l.size()<<endl; //사이즈 3 
	
	l.push_back(1); //1 삽입 
	
	//리스트: 4 4 4 1 
	
	l.remove(4); //4 모두 제거 
	
	//리스트: 1 
	
	for(auto n: l)
		cout<<n<<" ";
		
	return 0;	
}

 

 

  • 2.multimap
- 멀티맵은 이전에 설명했던 map과 거의 동일한데 하나의 key에 여러개의 value를 저장 할 수 있다는 점이 다릅니다.
 
- 하나의 key에 여러개의 value를 저장 할 수 있는 대신 map 에서 제공하는 [] 연산자를 통한 접근은 불가능합니다.
 
- <map>을 include 하고 multimap 으로 선언해서 사용하면 됩니다.
 
연산자는 이전에 설명했던 map과 동일 합니다. 따라서 기본적인 연산의 설명은 생략하고
 
upper_bound , lower_bound, equal_range 연산에 대해서 설명해 보려고 합니다.
 
  • lower_bound(key) 

key 값에 해당하는 첫번째 원소의 iterator를 반환합니다. 

  • upper_bound(key) 

key 값에 해당하는 마지막 원소의 다음 원소의 iterator를 반환합니다. 

  • equal_range(key)

key 값에 해당하는 원소들의 범위를 pair 객체로 반환합니다.

pair 객체의 first에는 첫번째로 나타나는 원소의 iterator가

second에는 마지막으로 나타나는 원소의 다음 원소의 iterator가 저장 되어 있습니다. 

즉 pair객체에는 lower_bound와 upper_bound가 저장 되어있습니다. 

 

이 연산들을 이용하면 multimap에서 key값의 범위를 조절해서 필요한 값을 찾아서 사용 할 수 있습니다.
 
추가적인 연산은 아래의 사이트를 참고해 주세요.
 
아래는 테스트 코드입니다.

 

#include <iostream>
#include <map>

using namespace std;

int main(void) {
	multimap<int, int> mm;
	
	mm.insert(make_pair(1,2));
	mm.insert(make_pair(1,3));
	mm.insert(make_pair(2,4));
	mm.insert(make_pair(3,5));
	mm.insert(make_pair(3,6));
	mm.insert(make_pair(3,7));
	mm.insert(make_pair(4,8)); 
	
	//lower_bound 는 3,5의 iterator를 upper_bound 는 3,7의 다음인 4,8의 iterator를 반환합니다. 
	for(auto it = mm.lower_bound(3); it != mm.upper_bound(3); it++) //key 값이 3인 원소 출력 
		cout<<'['<<it->first<<','<<it->second<<']'<<endl;
	
	for(auto it = mm.equal_range(3).first; it != mm.equal_range(3).second; it++) //key 값이 3인 원소 출력 
		cout<<'['<<it->first<<','<<it->second<<']'<<endl;
	
	return 0;
}
반응형