묻공러
[STL] list
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (521) N
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • C# (20) N
      • [루키스] C# (9)
      • [루키스] 자료구조 (3) N
      • [루키스] 실전 문법 (8) N
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 - 언리얼 (123)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
    • 게임 엔진 - 유니티 (14) N
      • [최적화] 유니티 (4) N
      • [루키스] 유니티 (10) N
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
C++/[루키스] STL

[STL] list

2024. 3. 17. 09:31

list의 동작원리
단일/이중/원형 등으로 다양한 종류의 링크드리스트가 있다
데이터의 위치가 불연속적이고
하나의 노드가 

1) 데이터

2) 이전이나 다음의 데이터 위치

를 알고 있는 형태이다

 

 

C++ STL list 동작원리

C++ STL list에서는

마지막 데이터가 포함된 노드에

추가적으로 NULL이 들어가는 end() 노드가 연결되어 있다

 

주의할 점으로는

1. 마지막 데이터 노드와 end() 노드가 서로 연결돼 있다

따라서, end() 노드에서 마지막 데이터 노트로 접근 가능

마지막 데이터 노드에서 end() 노드로 접근은 가능, 수정은 불가능

 

2. begin() 노드와 end() 노드가 서로 연결돼 있다

end() 노드의 next 노드로는 begin() 노드가

begin() 노드의 previous 노드로는 end() 노드로 서로 이어져있긴 하다

하지만, begin() 노드와 end() 노드가 서로를 자유롭게 접근해서 사용하는 경우는

불가능하도록 STL에서 막아놓았다

 


list 간단 사용법 및 vector와의 차이점

push_back, push_front를 지원하고
size 또한 지원한다
하지만 capacity는 지원하지 않는다

list 특성상 여유공간이 필요 없고 데이터가 추가될 때마다

노드만 추가하는 형태이기 때문이다

 

front, back 역시 가능하다
li[2] = 3; 처럼 임의 접근은 불가능하다

그 이유는 임의 접근을 하게 되면 시간이 너무 오래 걸리며 비효율적이기 때문이다

list<int>::iterator도 당연히 사용가능하고
for문과 함께 응용이 가능하다

insert, erase, pop_front 등도 지원한다
특정 데이터를 일괄 삭제하는 remove도 지원하며,

이는 vector에서 for문을 돌면서 데이터를 삭제하는 행위를 대체한다 

#include <iostream>
#include <list>
using namespace std;

void main(void)
{
	list<int> li;

	for (int i = 0 ; i < 10; ++i)
	{
		li.push_back(i);
	}

	li.push_front(100);
	
	cout << li.size() << endl;

	// li.capacity();//capacity는 따로 존재하지 않음

	cout << li.front() << " " << li.back() << endl;

	li.insert(li.begin(), 1000);

	li.erase(--li.end());

	li.pop_front();

	li.remove(5);// 일괄 삭제

	
	for (list<int>::iterator it = li.begin(); it != li.end(); ++it)
	{
		cout << *it << " ";
	}
}



list의 효율
1) 중간 삽입/삭제

list의 동작원리에 따라서

결국 노드의 연결만을 제어해 주면 쉽게 중간 삽입/삭제가 가능하다 

삽입
삭제


2) 처음/끝 삽입/삭제

중간 삽입/삭제처럼 결국 처음과 끝 또한

노드의 연결만을 제어해 주면 쉽게 처음/끝 삽입/삭제가 가능하다

 

3) 임의 접근
N번째에 접근하기 위해서는

N번째만큼 노드의 Next 혹은 Previous를 계속 타고 가야 하기 때문에

효율이 매우 좋지 않다

4) 중간 삽입/삭제의 진실

중간 삽입/삭제를 한다고 하면
사실상 중간의 데이터를 찾아서 삽입/삭제를 해야 한다
따라서, "임의 접근 + 중간 삽입/삭제"가 필요하다는 것이고
이는

중간 삽입/삭제가 빠를 뿐이고

데이터를 찾는 임의접근은 느리기에

전체 과정을 효율적이라고 보기는 힘들다

 

하지만

아래의 코드처럼

중간의 데이터의 위치를 미리 iterator를 통해  
알고 있는 상황이라면

중간 삽입/삭제만 이루어지기 때문에 효율적이다

#include <iostream>
#include <list>
using namespace std;

void main(void)
{
	list<int> li;

	list<int>::iterator itRemember;

	for (int i = 0; i < 10; ++i)
	{
		if (i == 5)
		{
			itRemember = li.insert(li.end(), i);
		}

		else
		li.push_back(i);
	}

	// 임의 접근을 for문을 돌면서 비효율적으로 찾는 법
	// list<int>::iterator it = li.begin();
	// for (int i = 0; i < 5; ++i)
	// {
	//	 ++it;
	// }
	// li.erase(it);

	// 위치를 미리 알고 있다면 쉽게 삽입 및 삭제 가능
	li.erase(itRemember);

	// Debug용
	for (list<int>::iterator it = li.begin(); it != li.end(); ++it)
	{
		cout << *it << " ";
	}
}
저작자표시 비영리 변경금지 (새창열림)

'C++ > [루키스] STL' 카테고리의 다른 글

[STL] multimap, multiset  (0) 2024.03.21
[STL] set  (0) 2024.03.20
[STL] map  (1) 2024.03.19
[STL] deque  (0) 2024.03.18
[STL] vector  (0) 2024.03.16
'C++/[루키스] STL' 카테고리의 다른 글
  • [STL] set
  • [STL] map
  • [STL] deque
  • [STL] vector
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.