C++ - STL(vector, list)

이강민·2023년 9월 5일

C++

목록 보기
21/22
post-thumbnail

STL

Standard Template Library, C++표준 라이브러리 중 하나로써 관련 템플릿과 클래스를 제공한다. STL은 크게 3가지 주요 컴포넌트를 제공한다.

  • 컨테이너(Container) : 데이터를 제공하고 저장하는 자료구조를 제공
  • 반복자(iterator) : 컨테이너 내 요소에 접근하기 위한 인터페이스 제공
  • 알고리즘(Algorism) : 정렬, 검색, 변환과 같은 알고리즘 함수를 제공 이 글에서는 컨테이너 중 vector와 list를 알아보고 이 두가지의 컨테이너의 iterator에 대해서 알아보도록 한다.

    vector

    std::vector은 배열과 유사한 자료구로써 일반적인 C언어에서의 배열과 다르게 vector는 동적 할당을 제공한다. 즉, 동적할당을 제공함으로써 기존의 고정된 크기의 배열이라는 단점을 벗어나 필요한 만큼 필요한 공간을 소모한다는 것이 가장 큰 특징이다.

    vector의 사용

    vector는 일반 배열처럼 vector_name[idx]를 사용하여 각 인덱스에 값에 접근할 수 있고 vector_name.at(idx)과 같이 클래스의 메소드 접근하는 방식으로 값에 접근 할 수 있다. vector는 값을 넣은만큼 크기가 할당되기 때문에 처음 push함수를 이용하여 값을 넣어야 한다.
    // 템플릿으로 제공하기에 저장하고자하는 타입을 결정해줘야 한다.
    #include <vector>
    int main(){
    	vercor<int> vecInt;
    	vecInt.push_back(20);
       	vecInt.push_back(30);
       	vecInt.push_back(40);
       //넣어진 값은 []를 이용하여 값을 수정 할 수 있다.
       vecInt[0] = 10;
       //vector에 들어간 값을 모두 확인하고 싶으면 다음과 같이 반복문을 작성한다.
       	for (size_t i = 0; i < vecInt.size(); i++)
    	{
    		std::cout << vecInt[i] << endl;
    	}
       
    	return 0;
    }
    data함수를 사용하면 vector의 주소값을 받아낼 수 있다.
    포인터로 역참조하면 값을 찾을 수 있다.
std::cout << *vecInt.data() << endl;

vector 내부의 iterator클래스 이용하기

STL의 특징은 컨테이너마다 iterator를 모두 구현했다는 것이다.
이 iterator를 통해서 자료구조의 값들을 쉽게 사용할 수 있도록 하는 것이다.

vector<int>::iterator vecIter = vecIter.begin();

vector는 클래스로 구현되어 있기 때문에 클래스 접근 연산자를 이용하여 접근한다.
iterator에 시작값을 알려주면 다음 vecIter에는 첫 번째 값의 주소값이 들어있다.
따라서 다음과 같은 연산이 가능하다.

*vecInt = 100;

첫 번째 값을 100을 재할당 한다는 것이다.
다음 값도 증감연산자를 통해 가져올 수 있다.

cout << *(++veciter) << endl;

list

연결리스트는 앞서 살펴보았듯이 노드로 이루어진 공간에 데이터와 다음 노드의 주소값이 할당되어 있어 서로 주소값으로 연결된 구조이다.
list도 마찬가지로 템플릿을 통해서 구현되어있기 때문에 타입을 결정해주어야 한다.

// int타입의 list 
list<int> listInt;
// 값을 앞으로 추가함.
listInt.push_front(30);
// 값을 뒤로 추가함.
listInt.push_back(20);

리스트는 배열 형태가 아니라 [ ] 연산자로 접근 할 수 없다.

list 내부의 iterator클래스 이용하기

vector와 마찬가지로 iterator로 초기화 할 때 첫 번째 데이터를 넣어준다.

list<int>::iterator iter = listInt.begin();	

실제 포인터 변수는 아니지만 포인터 변수를 오퍼레이터 연산자를 통해 포인터처럼 동작하도록 되어있다.

// 포인터 변수처럼 접근이 가능하다.
int iData = *iter;
// 다음 값을 증감연산자를 통해 접근이 가능하다.
++iter;
// 다음 값을 역참조 가능하다. 
iData = *iter;
	

리스트의 모든 값을 확인하기 위해 다음과 같이 반복문을 사용한다.


	for (iter = listInt.begin(); iter != listInt.end();  ++iter)
	{
		cout << *iter << endl;
	}

.end()함수는 마지막 데이터가 있는 공간의 다음 주소를 가르킨다. "마지막 값이 아니면"이라는 조건식을 통해서 모든 값에 접근이 가능하게 된다.

profile
AllTimeDevelop

0개의 댓글