반응형
728x90
반응형

이번엔 모든 컨테이너에서 공통적으로 지니는 멤버 함수들을 정리해 볼 것이다.

Container 대신에 해당하는 컨테이너 및 자료형 타입을 기입하여 사용하면 된다.

생성자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    vector<int> v1; // 1. Container(), 컨테이너를 생성.
    vector<int> v2(10); // 2. Container(size), 길이가 10개인(10*sizeof(type)) 컨테이너 생성.
    vector<int> v3(105); // 3. Container(size, value),  값이 5로 전부 채워진 길이 10개 컨테이너 생성.
    vector<int> v4(v3.begin(), v3.begin()+4); // 4. Container(iterator, iterator),  v3의 값을 복사하며 생성.
 
    vector<int>::iterator it;
 
    cout << endl << "v2---" << endl;
    for (it = v2.begin(); it < v2.end(); it++)
        cout << *it << ", ";
 
    cout << endl << "v3---" << endl;
    for (it = v3.begin(); it < v3.end(); it++)
        cout << *it << ", ";
 
    cout << endl << "v4---" << endl;
    for (it = v4.begin(); it < v4.end(); it++)
        cout << *it << ", ";
cs

실행 결과

empty()와 clear() 

1
2
3
4
5
6
7
8
9
10
11
12
vector<int> v1; 
vector<int> v2(10); 
vector<int> v3(105); 
vector<int> v4(v3.begin(), v3.begin()+4); 
 
vector<int>::iterator it;
 
cout << "vector<int> v1; : " << v1.empty() << endl// true 반환
cout << "vector<int> v2(10); : " << v2.empty() << endl// false 반환
cout << "vector<int> v3(10, 5); : " << v3.empty() << endl// false 반환
v4.clear(); // 모든 요소 제거
cout << "v4.clear(); : " << v4.empty() << endl// true 반환
cs

empty() 멤버 함수는 해당 콘테이너가 비어져있는지를 확인하는 함수이고, clear() 멤버 함수는 해당 콘테이너 속 요소를 모두 제거 한다.

begin(), end() 와 erase()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<int> v1; 
vector<int> v2(10); 
vector<int> v3(105); 
vector<int> v4(v3.begin(), v3.begin()+4); 
 
vector<int>::iterator it;
 
v3.erase(v3.begin(), v3.end() - 1); // 범위로 지우기 : v3.begin() 부터 (v3.end()-1)-1 까지 지운다.
for (it = v3.begin(); it < v3.end(); it++)
    cout << *it << ", ";
cout << endl;
 
v3.erase(v3.begin()); // 위에서 하나 남기고 모두 지웠으니, 시작 하나만 지우면 다 지워지는 꼴.
for (it = v3.begin(); it < v3.end(); it++)
    cout << *it << ", ";
cout << endl;
cs

begin() 함수와 end() 함수는 콘테이너의 시작과 끝 위치를 iterator 형으로 리턴한다. erase 멤버 함수는 컨테이너 내의 요소를 지우는 함수인데, 8번 라인처럼 범위로 지울 수 있고, 13번 라인처럼 해당 요소에 대해서 지울 수 있다.

insert()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> v3(105); 
vector<int> v4(5100); 
vector<int>::iterator it;
 
v3.insert(v3.end() - 19999);
 
for (it = v3.begin(); it < v3.end(); it++)
    cout << *it << ", ";
cout << endl;
 
v4.insert(v4.end(), v3.begin(), v3.end());
 
for (it = v4.begin(); it < v4.end(); it++)
    cout << *it << ", ";
cout << endl;
cs

 

insert() 멤버 함수는 요소를 삽입하는 함수인데 마찬가지로, 5번 라인/11번 라인의 두 가지 형태로 삽입이 가능하다. 요소를 삽입하느냐, 범위로 삽입하느냐.

push_back(), pop_back()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int> v3(105); 
vector<int> v4(5100); 
 
vector<int>::iterator it;
 
v3.push_back(1000000);
for (it = v3.begin(); it < v3.end(); it++)
    cout << *it << ", ";
cout << endl;
 
v3.pop_back(); // 리턴 값이 없으며, 삭제만 가능하다.
for (it = v3.begin(); it < v3.end(); it++)
    cout << *it << ", ";
cout << endl;
cs

push_back 함수는 벡터의 가장 마지막에 요소를 추가, pop_back() 함수는 가장 마지막 요소를 삭제한다. 11번 라인에서의 주석처럼 pop_back()는 리턴 값이 없고 삭제만 가능하다.

operator=(),  operator()==, size()


1
2
3
4
5
6
7
8
9
10
11
12
vector<int> v1({ 1,2,3,4,5 });
vector<int> v2;
 
cout << "v1.size() : " << v1.size() << endl;
v2 = v1; // operator()=
cout << "v2.size() : " << v2.size() << endl;
 
if (v1 == v2)
    cout << "v1과 v2는 동일한 값을 지닙니다." << endl;
else
    cout << "v1과 v2는 동일한 값을 지니지 않습니다." << endl;
    
cs

 

이로써 공통 멤버함수들에 대한 정리 끝!

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

List  (0) 2020.09.14
Deque  (0) 2020.09.13
Iterator( With vector )  (0) 2020.09.13
Vector  (0) 2020.09.12
STL:Container, Iterator, Algorithm 개념  (0) 2020.09.10
728x90
반응형

벡터

벡터가 무엇인지 한번 찾아보았다. 간단하게 정의하자면 순차 컨테이너에 속하는 동적 배열이다. C의 배열과 똑같이 행동한다.

그렇다면 C의 배열과 벡터의 차이점은 무엇일까? 

1. 타입에 상관없이 모든 타입에 대해서 일반적인 배열을 만들 수 있다.
=> int, double, char, int *, 객체 가릴 것 없이 모든 타입에 대해서 배열을 만들 수 있다는 이야기이다.
2. 배열의 크기 조절이 자동으로 이루어지며, 추가 및 삭제에 대한 인터페이스를 제공한다
=> 배열에 값을 추가하기 위해 새롭게 더 큰 메모리를 할당하고, 값을 복사하고 기존 메모리를 해체하고... 이러한 과정들을
알아서 해준다는 것이다! 개꿀!!!!ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그러나 2번과 같은 장점에 따른 단점 또한 존재한다.

C++의 벡터는 무조건 데이터를 선형적으로 만들려고 한다.( 그렇기에 이름도 순차 컨테이너. ) 중간에 끊긴다거나 하면 안된다는 소리이다. 

왼쪽과 같은 형태는 가능하지만, 오른쪽과 같은 형태는 안된다는 소리이다. 이러한 선형을 유지해야하는 특징 때문에 값을 추가할 때 단점이 발생한다.

메모리 공간이 충분하여 기존에 이어서 확장한 후 값을 그냥 더 추가할 경우에는 문제가 안된다.
아래의 그림처럼 말이야.

그런데 다음 그림과 같이 기존의 6개 메모리 뒤에 다른 관련없는 값이 이미 할당되어 기존의 6개 메모리 뒤에 연이어 추가 확장이 불가능한 경우는 문제가 발생한다.

이러한 경우에는 

이렇게 복사, 확장, 추가, 소멸 등의 여러 작업들이 필요하니 속도가 느려지는 단점이 있다.

설명은 이 정도로 정리하도록 하고, 매우 간단한 코드를 기록해보자.

7번 라인에서 볼 수 있듯이 템플릿 문법을 활용하여 사용한다. 반복자를 활용하지 않은 가장 기본 기본 기본적인 벡터 예제이다. 실행 결과는 매우 뻔하기 때문에 생략~

9번 라인에서 처럼 .size() 함수를 통해 벡터가 정의된 길이를 확인할 수 있다.

다음 vector 에서 제공하는 push_back 함수를 사용한 예이다. push_back 함수를 사용하면 벡터 열에 손쉽게 데이터를 추가할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <vector>
 
using namespace std;
 
int main(void)
{
    int max_number = 0;
    int val = 0;
    vector<int> num_vector;
 
    while (true)
    {
        cout << "벡터에 추가할 숫자를 입력하세요 (-123123 입력 시 종료) : ";
        cin >> val;
        if (val == -123123)
            break;
        else
            num_vector.push_back(val);
    }
 
    max_number = num_vector[0];
 
    for (int i = 0; i < num_vector.size(); i++)
    {
        if (num_vector[i] > max_number)
            max_number = num_vector[i];
    }
 
    cout << " 입력한 값 중에서 최대 값은 " << max_number << " 입니다." << endl;
    return 0;
}
cs

 

 

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Deque  (0) 2020.09.13
모든 컨테이너 공통 멤버  (0) 2020.09.13
Iterator( With vector )  (0) 2020.09.13
STL:Container, Iterator, Algorithm 개념  (0) 2020.09.10
C++ STL(Standard Template Library이란?  (0) 2020.09.07
728x90
반응형

오늘은 컨테이너, 이터레이터, 알고리즘이란 무엇이며, 무엇이 있는지 학습한 결과를 기록한다.

Container

컨테이너는 뜻 그대로 그릇, 무언가 담을 수 있는 역할을 한다. 즉, 자료 및 값을 저장하는 역할을 한다. 이 그릇의 모양이나 크기에 따라 담기를 권장되는 내용물이 다르고 취급 방법이 다르다.(컵이라는 그릇에 라면을 담을 수는 있지만 효율적이지 못한 것처럼.)

먼저, 컨테이너에는 순차 컨테이너, 연관 컨테이너, 컨테이너 어댑터 등이 있다. 

이게 무슨 소리인가? 

순차 컨테이너 : 뭔가 자료들이 순차적으로 들어가는거..?
연관 컨테이너 : 연관되어서 들어가는거..? 쌍으로 연관되어서 들어가는 것인가?
컨테이너 어댑터 : 어댑터란 다른 전기나 기계 장치를 서로 연결해서 작동할 수 있도록 만들어 주는 결합 도구 라는 정의가 있는 것으로 보아, 컨테이너와 컨테이너를 변환할 수 있는 그런게 아닐까?

나는 리얼로 위와 같이 생각했다. 내가 조사해 본 컨테이너들은 다음과 같다.

순차 컨테이너 

말 그대로 순차적으로 자료를 저장한다. 내 예측이 맞았다! 순차 컨테이너에서는 자료의 추가가 빠르지만 탐색할 때에는 시간이 많이 걸린다. 왜냐하면 순차적으로 접근하기 때문에!

이러한 순차 컨테이너에는 vector, deque, list 가 있다. 그렇게 벡터, 벡터했던게 바로 여기서 나오는 개념이었구나~

1. Vector : 동적 배열 처럼 동작하며, 자료는 뒤 쪽에서 추가된다.
2. Deque : 벡터와 유사하지만 앞에서도 자료들이 추가될 수 있다.
3. List : 벡터와 유사하지만 중간에서 자료를 추가하는 연산이 효율적이다.

연관 컨테이너

다음은 연관 컨테이너이다. 연관 컨테이너는 조사해 본 결과 사전과 같은 구조로 자료를 저장한다고 한다. 즉, 키와 값의 형태로 데이터가 저장되고, 자료들은 정렬되어 있으며 이러한 정렬 때문에 자료 추가에는 시간이 걸리지만 탐색은 키를 통하여 한 번에 뽑아내니 빠르다. 

이러한 연관 컨테이너에는 Set, Map, MultiSet, MultiMap 등이 있다

1. set : 집합이라고 하며, 중복이 없는 자료들이 정렬되어 저장된다.
2. map : 맵이라고 하며, key - value 형태로 저장된다.
3. multiset : 다중 집합이라고 하며, 집합과 유사하지만 자료의 중복을 허용한다.
4. multimap : 다중 맵이라고 하며, 맵과 유사하지만 키가 중복될 수 있다.

컨테이너 어댑터

드디어 컨테이너 어댑터이다!

컨테이너 어댑터는 기존 컨테이너의 인터페이시를 제한하여 만든 기능이 제한되거나 변형된 컨테이너를 의미한다고 한다. 이게 무슨 말일까 싶어서 좀 더 확인해보았는데

컨테이너 어댑터에는 Stack이 있다. 이를 예로 들자면, 기본 컨테이너인 벡터는 vector 클래스를 사용하는데 이 클래스의 인터페이스를 제한하고(벡터의 여러 기능들을 제한하고) 특정 형태(스택에 관련된 연산)의 동작 만을 수행하도록 한다.

그러니까 한 마디로 내가 어떤 자료구조를 구현할 것 인데 그냥 밑 바닥부터 구현하기 힘들고 귀찮은데 마침 기가 막히고 검증된 기존의 컨테이너가 있으니 이를 활용하여 확장 및 축소 등의 적용(Adapt)을 하는 것이라고 보면 될 것 같다. 그런데 뭔가 계속 제한한다고 하는데 이는 기존의 컨테이너에서 필요없는 부분은 사용하지 못하도록 하는 의미의 제한인 것 같다.

아무튼, 이러한 컨테이너 어댑터에는 Stack, Queue, Priority queue이 제공된다.

Iterator

이제는 반복자(Iterator)의 개념이다.

이 반복자는 각 컨테이너의 자료구조에 맞는 액세스를 할 수 있도록 도와준다. 예를 들어 순회를 한다거나, 원하는 값이 있는 메모리에 접근 가능하도록. 검증되었기 때문에 안심하고 사용해도 된다.

일종의 포인터와 비슷한 객체이다. 기존의 자료구조에서 보면 링크드 리스트에서만 보더라도 노드를 순회하기 위해서는 포인터의 값을 증가 혹은 감소시키고 여러 검사를 하는 등 작업을 했는데 반복자가 이를 대신해준다고 보면 된다. 

알고리즘마다 각기 다른 방식으로 컨테이너 요소들에 접근하기 때문에 반복자에도 여러 종류들이 존재한다. 그렇기 때문에 컨테이너를 사용한다면 꼭 반복자를 사용해야 한다.

반복자에는 몇 가지 예를 들자면 input iterator, output iterator, forward iterator, bidirectional iterator, random access iterator 등이 있다.

Algorithm

알고리즘은 문제 해결하기 위해서 그 절차나 방법의 공식화를 의미한다.

탐색, 정렬, 반전, 삭제, 변환 등이 있다.

 

위와 같이 3가지 요소로 구성된 것이 C++ STL이라는 것을 학습했고, 대충 개념을 잡게 되었다.

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Deque  (0) 2020.09.13
모든 컨테이너 공통 멤버  (0) 2020.09.13
Iterator( With vector )  (0) 2020.09.13
Vector  (0) 2020.09.12
C++ STL(Standard Template Library이란?  (0) 2020.09.07

+ Recent posts