[STL] list

치치·2025λ…„ 5μ›” 28일

STL

λͺ©λ‘ 보기
11/21
post-thumbnail

πŸ“Œ μ‹œν€€μŠ€ μ»¨ν…Œμ΄λ„ˆ - List

βœ… std::list μ£Όμš” ꡬ성 μš”μ†Œ 정리

βœ… μƒμ„±μž

κ΅¬λΆ„μΈν„°νŽ˜μ΄μŠ€μ„€λͺ…
μƒμ„±μžlist()빈 리슀트 생성
list(size_type n)n개의 κΈ°λ³Έκ°’ μš”μ†Œ 생성
list(size_type n, const T& val)n개의 val둜 μ΄ˆκΈ°ν™”
list(const list& other)볡사 μƒμ„±μž
list(list&& other)이동 μƒμ„±μž (C++11)
list(initializer_list<T>){}둜 μ΄ˆκΈ°ν™”
template<class InputIt> list(InputIt first, InputIt last)반볡자 ꡬ간 볡사

βœ… 멀버 ν•¨μˆ˜

멀버 ν•¨μˆ˜μΈν„°νŽ˜μ΄μŠ€μ„€λͺ…
Capacityempty()λΉ„μ–΄ μžˆλŠ”μ§€ 확인
size()μš”μ†Œ 개수 λ°˜ν™˜
resize(n)크기 쑰절
max_size()κ°€λŠ₯ν•œ μ΅œλŒ€ 크기 λ°˜ν™˜
Element Accessfront() / back()μ•ž/λ’€ μš”μ†Œ λ°˜ν™˜
Modifiersassign(...)κ°’ λ˜λŠ” λ²”μœ„λ‘œ ꡐ체
push_front(val) / push_back(val)μ•ž/λ’€ μ‚½μž…
pop_front() / pop_back()μ•ž/λ’€ 제거
insert(pos, val)pos μœ„μΉ˜μ— μ‚½μž…
erase(pos) / erase(first, last)μš”μ†Œ 제거
clear()λͺ¨λ‘ 제거
swap(other)λ‹€λ₯Έ list와 κ΅ν™˜
emplace(...) / emplace_front() / emplace_back()직접 생성 μ‚½μž…
remove(val) / remove_if(pred)쑰건에 따라 제거
unique()쀑볡 연속 μš”μ†Œ 제거
merge(list& other)μ •λ ¬λœ 리슀트 병합
reverse()μˆœμ„œ λ’€μ§‘κΈ°
sort()μ •λ ¬
Iteratorsbegin() / end()순방ν–₯ 반볡자
rbegin() / rend()μ—­λ°©ν–₯ 반볡자
cbegin() / cend()const 반볡자
crbegin() / crend()const μ—­λ°˜λ³΅μž

βœ… μ—°μ‚°μž

μ—°μ‚°μžμΈν„°νŽ˜μ΄μŠ€μ„€λͺ…
비ꡐ==, !=, <, <=, >, >=리슀트 κ°’ 비ꡐ
λŒ€μž…operator=리슀트 볡사 λŒ€μž…
μš”μ†Œ μ ‘κ·Όfront() / back()μ•ž/λ’€ μš”μ†Œ 확인 (직접 μ ‘κ·Ό λΆˆκ°€)

βœ… 멀버 νƒ€μž…

멀버 νƒ€μž…μ •μ˜μ„€λͺ…
value_typeTμ €μž₯ νƒ€μž…
reference / const_referenceT&, const T&μ°Έμ‘° νƒ€μž…
pointer / const_pointerT*, const T*포인터 νƒ€μž…
iterator / const_iteratorμ–‘λ°©ν–₯ λ°˜λ³΅μžμš”μ†Œ 순회용
reverse_iteratorμ—­λ°©ν–₯ λ°˜λ³΅μžμ—­μˆœ 순회용
size_typestd::size_t크기 νƒ€μž…
difference_typestd::ptrdiff_t반볡자 차이 계산



βœ… List μ£Όμš” νŠΉμ§•

  • λ©”λͺ¨λ¦¬ ꡬ쑰 : λ…Έλ“œ 기반 μ—°κ²° ꡬ쑰

  • μž„μ˜ μ ‘κ·Ό : λΆˆκ°€λŠ₯ (인덱슀 μ ‘κ·Ό λΆˆκ°€), at(), [ ] μ ‘κ·Ό λΆˆκ°€λŠ₯

  • μ •λ ¬ : 자체 μ •λ ¬ λ©”μ„œλ“œ (sort())

  • 반볡자 : μ–‘λ°©ν–₯ 반볡자


πŸ“Œ List μžμ„Ένžˆ μ•Œμ•„λ³΄μž


βœ… List의 μ›μ†Œ 좜λ ₯

λ¦¬μŠ€νŠΈλŠ” 인덱슀 접근이 μ•ˆλ˜κΈ° λ•Œλ¬Έμ— μš”μ†Œ 좜λ ₯ μ‹œ 반볡자 μ‚¬μš©


βœ… remove() / remove_if()

β­• remove()

ν•΄λ‹Ήν•˜λŠ” μ›μ†ŒλŠ” λͺ¨λ‘ μ‚­μ œ

β­• remove_if()

  • remove_if() λ‚΄λΆ€ λ™μž‘
    -> 리슀트의 μš”μ†Œλ“€μ„ ν•˜λ‚˜μ”© Predicateν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ 전달

|---

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

// true / falseλ₯Ό λ°˜ν™˜ν•˜λŠ” 콜백 ν•¨μˆ˜
bool Predicate(int n)
{
	return 10 <= n && n <= 30;
}

int main()
{
	list <int> lst;

	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);
	lst.push_back(40);
	lst.push_back(50);
	lst.push_back(10);

	list <int> :: iterator iter;

	for (iter = lst.begin(); iter != lst.end(); iter++)
	{
		cout << *iter << " ";
	}
	
    // 10 20 30 40 50 10
    
	cout << endl << endl;

	// remove_if() λ‚΄λΆ€μ—μ„œ μž‘λ™ : 리슀트의 μš”μ†Œλ“€μ„ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κΉ€ 
	lst.remove_if(Predicate);

	for (iter = lst.begin(); iter != lst.end(); iter++)
	{
		cout << *iter << " ";
	}
    
    // 40 50
}

βœ… μž˜λΌλΆ™μ΄κΈ° splice()

리슀트 μ „μš© κΈ°λŠ₯이기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ 같은 리슀트 νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€

  • νƒ€μž…1. li.splice(μ‚½μž… ν•  μœ„μΉ˜, μ‚½μž… ν•  μ›μ†Œ);
    ➑ 리슀트 전체 이동

  • νƒ€μž…2. li.splice(μ‚½μž… ν•  μœ„μΉ˜, μ‚½μž… ν•  μ›μ†Œ, μ›μ†Œμ˜ μœ„μΉ˜);
    ➑ λ¦¬μŠ€νŠΈμ—μ„œ μ›μ†Œ ν•˜λ‚˜λ§Œ 이동

  • νƒ€μž…3. li.splice(μ‚½μž… ν•  μœ„μΉ˜, μ‚½μž… ν•  μ›μ†Œ, μ›μ†Œμ˜ λ²”μœ„ ꡬ간);
    ➑ λ¦¬μŠ€νŠΈμ—μ„œ νŠΉμ • ꡬ간을 이동

βœ… νƒ€μž…1 splice - 전체 이동

반볡자 iterκ°€ 가리킀고 μžˆλŠ” μœ„μΉ˜ [1]에 li2 전체λ₯Ό μ‚½μž…ν•¨.
➑ 기쑴의 li2λŠ” λΉ„κ²Œ λœλ‹€.

|---

βœ… νƒ€μž…2 splice - ν•˜λ‚˜ 이동

리슀트 a에 리슀트 b의 일뢀 μ›μ†Œλ₯Ό μž˜λΌλ‚΄κ³  뢙인닀.

|---

βœ… νƒ€μž…3 splice - 전체 쀑 일뢀 이동



βœ… 쀑볡 μš”μ†Œ 제거 unique

β­• λ¦¬μŠ€νŠΈμ—μ„œ μ€‘λ³΅λœ 연속 μš”μ†Œλ₯Ό μ œκ±°ν•  수 μžˆλ‹€.
➑ μ—°μ†λœ(μΈμ ‘ν•œ) μ€‘λ³΅λ§Œ μ œκ±°ν•œλ‹€!!!

➑ μ•„λž˜μ˜ μ½”λ“œμ—μ„œλ„ μΈμ ‘ν•˜μ§€ μ•Šμ€ μš”μ†Œ 20κ³Ό 30은 λ‚¨μ•„μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

β­• λ§Œμ•½ μΈμ ‘ν•˜μ§€ μ•Šμ€ 쀑볡 μš”μ†Œλ„ μ œκ±°ν•˜κ³  μ‹Άλ‹€λ©΄?
➑ unique(μ‘°κ±΄ν•¨μˆ˜); 둜 쑰건이 참인 μ›μ†Œλ§Œ μ œκ±°ν•  수 μžˆλ‹€.



βœ… 리슀트의 μ •λ ¬ sort()

벑터와 덱은 μž„μ˜ 접근을 톡해 sort()λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •λ ¬ν•  수 μžˆμ§€λ§Œ , λ¦¬μŠ€νŠΈλŠ” μž„μ˜ 접근이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 자체 μ •λ ¬ 멀버 ν•¨μˆ˜ sort()λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •λ ¬ν•œλ‹€.



βœ… 리슀트의 병합 merge()

  • μ •λ ¬λœ 리슀트 μ „μš©μ΄κΈ° λ•Œλ¬Έμ— λ³‘ν•©ν•˜λ €λŠ” 두 리슀트의 μ •λ ¬ ν•„μˆ˜
    ➑ λ³‘ν•©ν•˜λ €λŠ” 두 리슀트의 정렬이 λ‹€λ₯΄λ‹€λ©΄ 였λ₯˜

  • β­• 기본은 μ˜€λ¦„μ°¨μˆœ μ •λ ¬
    ➑ 두 리슀트 λͺ¨λ‘ μ˜€λ¦„μ°¨μˆœμ΄μ–΄μ•Όν•¨

  • β­• λ§Œμ•½ 두 λ¦¬μŠ€νŠΈκ°€ λ‚΄λ¦Όμ°¨μˆœ 정렬이라면?
    λ‚΄λ¦Όμ°¨μˆœ 정렬은 greater<int> 비ꡐ ν•¨μˆ˜ 객체λ₯Ό μ‚¬μš©ν•œλ‹€


profile
뉴비 개발자

0개의 λŒ“κΈ€