#39. List
list의 사용을 위해서는 #include <list> 를 해주면 된다.
리스트는 아래와 같이 선언한다.
list<자료형> 변수명;
리스트는 벡터와는 달리 앞 뒤 모두 원소삽입이 가능하다.
push_back, push_front
list는 노드기반의 컨테이너이기 때문에, 인덱스접근이 불가능
즉, []의 사용이 불가능하다
listInt[2] -> 불가능!
따라서 원소를 순회하기 위해서는 반복자를 이용해야 하는데
아래와 같다
list<int>::iterator iter_begin=listInt.begin();
for(; iter_begin!=listInt.end() ; ++iter_begin)
cout<<*iter_begin<<endl;
반복자를 선언 할 때 마다 list<int>::iterator 를 써주는것이 매우 귀찮은 일인데,
auto라는것을 사용하면 매우 편해진다.
#auto
-> 자동으로 자료형을 매칭 시켜주는 자료형이다.
-> 자동으로 오른쪽항을 파악해 매칭시켜 주기 때문에 선언과 동시에 초기화가 이루어져야 한다.
auto를 활용해서 반복자를 선언해보면
auto iter_begin = listInt.begin();
auto iter_being = listInt.end();
다음과 같이 간단하게 선언할 수 있다.
#범위 기반 for문
위와 같이 반복자를 이용해서 for문을 돌려서 원소를 순회 할 수도 있지만
범위기반 for문을 이용하면 간단하게 작성 할 수 있다.
for(변수선언 : 순회 할 컨테이너)
=> for(auto& i : listInt)
이와 같이 범위 기반 for문을 이용하게 되면 처음부터 끝까지 모두 순회를 한다.
*범위기반 for문과 auto는 모두 C++ 11버전 이후로 생긴 문법이다.
#중간 삽입, 삭제
list의 경우에는
iter_begin으로 중간삽입을 하여도 벡터처럼 end의 위치가 변하는것이 아니기 때문에 문제가 없다.
다만 삭제의 경우에는 역시나 iter_begin의 위치가 삭제되는 것 이기 때문에 무효화가 발생한다.
#정렬
-> list는 배열 기반이 아니기 때문에 sort함수를 사용 할 수 없다.
멤버함수의 sort를 사용하면 된다.
listInt.sort(조건자)로 사용이 가능하다.
또한 기본적인 조건자는 #include <functional>에 포함되어 있다.
위를 포함시키고
listInt.sort(less<int>());
를 하게되면 오름차순으로 정렬이 되게 된다. (내림차순은 greater)
(listInt.reverse(); 를 쓰게되면 역순으로 정렬 시켜준다.)