Programming Language/C,C++

C++ STL list의 기본적인 사용법 정리

TwinParadox 2017. 12. 30. 11:56
728x90

C++로 알고리즘 문제를 풀다 보면 STL을 자주 사용한다. 다양한 방식으로 자료를 다루는 스택, 큐, 링크드 리스트 등을 직접 구현하지 않아도 최적화된 환경에서 잘 이용해먹을 수 있게 해주는 도구로, 이번 포스트에서는 STL에서 list에 대해 간단하게 다뤄볼까 한다. 사실, 다룬다는 개념보다는 정리한다는 측면이 더 강할 것이다.


list는 순차적인 컨테이너로, 메모리 할당은 연속적으로 이루어지지 않는다. vector와 비교했을 때, 랜덤 접근이나 탐색 측면에서는 vector가 더 좋은 성능을 보이지만, 특정 위치를 정해둔 상태에서 삽입이나 삭제가 이루어질 경우에는 vector에 비해 빠르다는 장점을 가지고 있다.


종합적으로 볼 때, list는 중간 데이터 삭제와 삽입이 자주 발생하면서, 순차적으로 저장된 데이터 빈번히 검색하지 않을 때 사용하는 게 좋다.


list는 list 헤더파일과 std 네임스페이스가 있어야 한다.


아래는 list를 사용하면 한 번쯤은 사용하게 되는 함수 목록이다. list는 기본적으로 우리가 흔히 head, tail 노드로 구현했던 전방 삽입/삭제, 후방 삽입/삭제를 지원하며 그 외에도 꽤 유용한 함수들을 제공하고 있다. 이들 함수들에 대해서는 MSDN과 cplusplus에서 더 다양하고 자세하게 다루고 있다.



front()

리스트의 첫번째 요소(head)의 레퍼런스 값을 반환

back()

리스트의 마지막 요소(tail)의 레퍼런스 값을 반환


push_front(e)

요소 e를 리스트의 시작 부분(head)에 삽입

push_back(e)

요소 e를 리스트의 끝 부분(tail)에 삽입


pop_front()

리스트의 첫 번째 요소를 삭제하며, 리스트 사이즈도 감소

pop_back()

리스트의 마지막 요소를 삭제하며, 리스트 사이즈도 감소


begin()

리스트의 첫 번째 요소를 가리키는 반복자(iterator)를 반환

end()

리스트의 마지막 요소(tail 노드가 아닌 유의미한 값이 있는 요소)를 가리키는 반복자(iterator)를 반환


empty()

리스트가 비었음을 확인(비었음 : 1, 비어 있지 않음 : 0)


insert()

특정 위치의 요소 앞에 새로운 요소를 삽입


erase()

하나 혹은 그 이상의 요소를 리스트에서 삭제


assign()

리스트를 제시된 요소들로 대체(리스트 값이거나, 특정 배열도 가능), 리스트 내용을 전부 바꾸며, 이에 알맞게 리스트의 크기도 조정


remove()

주어진 요소와 동일한 요소들을 리스트 내에서 전부 삭제


reverse()

리스트 뒤집기


size()

리스트의 크기(요소의 수) 반환


sort()

리스트 정렬, 기본적으로 오름차순 정렬



기본적인 함수 활용 예제 코드

#include <iostream>
#include <list>
using namespace std;
void showlist(list<int> g)
{
	cout << "전체 출력 : ";
	for (list<int>::iterator it = g.begin(); it != g.end(); it++)
		cout << *it << ' ';
	cout << endl;
}
int main(void)
{
	list<int> ex;

	// push_back, push_front
	for (int i = 0; i <= 20; i += 2)
		ex.push_back(i);
	showlist(ex);
	ex.push_back(-1);
	ex.push_front(-1);
	showlist(ex);

	// empty, pop
	while (!ex.empty())
		ex.pop_back();
	if (ex.empty())
		cout << "리스트가 비어 있습니다.\n";

	// insert
	for (int i = 1; i <= 20; i += 2)
		ex.push_back(i);
	ex.insert(ex.end(), 100);
	showlist(ex);

	// erase
	ex.erase(ex.begin());
	ex.erase(ex.begin());
	ex.erase(ex.begin());
	showlist(ex);

	// reverse
	ex.reverse();
	showlist(ex);

	// assign
	list<int> src;
	for (int i = 0; i < 5; i++)
		src.push_back(3);
	src.push_back(10);
	src.push_back(5);
	src.push_back(-5);
	src.push_back(-2);
	src.push_back(0);
	ex.assign(src.begin(), src.end());
	showlist(ex);
	
	// remove
	ex.remove(3);
	showlist(ex);

	// size
	cout << "리스트 크기 : " << ex.size() << endl;

	// sort
	ex.sort();
	showlist(ex);
}


728x90
728x90