std::list의 기본std::list의 정의와 특징size와 capacitysize:size() 함수로 확인합니다.capacity:std::list<int> li{1, 2, 3, 4, 5};
std::cout << "Size: " << li.size() << std::endl; // 출력: Size: 5
push_front): O(1)push_back): O(1)erase): O(1) (삽입과 동일한 조건 하에서).std::list<int> li;
li.push_front(10); // 앞에 삽입
li.push_back(20); // 뒤에 삽입
auto it = li.begin();
li.insert(it, 15); // 중간 삽입
li.erase(it); // 중간 삭제
list[3])을 지원하지 않습니다.리스트의 요소를 순회하려면 반복자를 사용합니다.
std::list<int> li{1, 2, 3, 4, 5};
for (auto it = li.begin(); it != li.end(); ++it) {
std::cout << *it << " ";
}
// 출력: 1 2 3 4 5
for (auto it = li.begin(); it != li.end();) {
if (*it % 2 == 0) { // 짝수인 경우
it = li.erase(it); // 현재 노드 삭제 후 다음 반복자로 갱신
} else {
++it; // 다음 노드로 이동
}
}
insert와 erase의 활용insert(iterator pos, value):pos의 위치에 값을 삽입합니다.erase(iterator pos):pos가 가리키는 노드를 제거합니다.std::list<int> li{1, 2, 3};
auto it = li.end();
it = li.insert(it, 4); // 끝에 4 삽입
li.insert(it, 100); // 4 앞에 100 삽입
li.erase(it); // 4 삭제
std::list의 반복자리스트는 양방향 반복자를 제공합니다. 벡터의 반복자보다 구현 방식이 더 많고 복잡하며, 다음과 같은 특징이 있습니다:
Iterator() : _node(nullptr) {}
Iterator(Node<T>* node) : _node(node) {}
_node 포인터를 멤버로 가집니다.Iterator& operator++() {
_node = _node->next;
return *this;
}
_node를 다음 노드로 이동시키고, 이동한 반복자를 반환합니다.Iterator operator++(int) {
Iterator temp = *this;
_node = _node->next;
return temp;
}
temp를 반환하고, _node를 다음 노드로 이동시킵니다.T& operator*() {
return _node->data;
}
bool operator==(const Iterator& other) const {
return _node == other._node;
}
bool operator!=(const Iterator& other) const {
return _node != other._node;
}
true를 반환합니다.리스트는 begin()과 end() 함수를 통해 반복자를 제공합니다.
iterator begin() { return iterator(_head->next); }
iterator end() { return iterator(_tail); }
begin(): 첫 번째 데이터 노드를 가리키는 반복자를 반환합니다.end(): 마지막 더미 노드를 가리키는 반복자를 반환합니다.List<int> myList;
auto it = myList.begin();
while (it != myList.end()) {
std::cout << *it << " ";
++it;
}
begin()부터 end()까지 반복자를 사용해 리스트를 순회합니다.양방향 리스트의 반복자는 이전 노드로 이동하는 기능도 제공합니다.
Iterator& operator--() {
_node = _node->prev;
return *this;
}
std::list와 std::vector의 비교| 특징 | std::list | std::vector |
|---|---|---|
| 메모리 구조 | 비연속적 | 연속적 |
| 임의 접근 | 지원하지 않음 | 지원 (O(1)) |
| 삽입/삭제 | O(1) (특정 위치에서) | O(N) (중간 삽입/삭제) |
| 순회 속도 | 느림 (포인터 따라 이동) | 빠름 (메모리 연속성) |
| 메모리 재할당 | 없음 | 필요 (용량 초과 시) |