C C++

[C | C++] Array, List, Vector, Queue, Deque

Posted by DHniyeo Blog on September 16, 2023

🐿️ Array

참고 : https://www.programiz.com/c-programming/c-arrays

배열(Array)은 여러 개의 값을 저장할 수 있는 변수로, 동일한 데이터 타입의 요소들로 이루어져 있습니다. 예를 들어, 만약 100개의 정수를 저장하려고 한다면, 배열을 사용하여 저장할 수 있습니다. C++의 배열 선언 예시는 다음과 같습니다:

1
int data[100];

위의 예시에서는 100개의 정수를 저장할 수 있는 data라는 배열을 정수형으로 선언하였습니다. 배열의 크기와 타입은 선언 이후에 변경할 수 없습니다.

배열은 0부터 시작하는 인덱스를 사용하여 요소에 접근할 수 있습니다. 위의 예시에서는 data[0]이 첫 번째 요소를 의미하며, data[99]가 마지막 요소를 의미합니다. 또한, 배열의 요소에 값을 할당하거나 출력할 수도 있습니다. 예를 들어, 다음과 같이 배열의 세 번째 요소의 값을 -1로 변경한 후, 다섯 번째 요소의 값을 0으로 변경할 수 있습니다:

1
2
data[2] = -1;
data[4] = 0;

또한, 사용자로부터 입력을 받아 배열의 요소에 값을 할당하거나, 배열의 요소 값을 출력하는 것도 가능합니다:

1
2
scanf("%d", &data[2]);
printf("%d", data[0]);

배열은 주로 동일한 타입의 데이터를 컴팩트하게 저장하고 관리하기 위해 사용됩니다. 그러나 배열의 크기를 동적으로 조정할 수 없으며, 크기가 고정되어 있으므로 저장할 수 있는 요소의 수가 제한되어 있습니다.

🐿️ List

참고 : https://www.programiz.com/cpp-programming/list

리스트(List)는 데이터 요소들을 순차적으로 저장하는 자료구조입니다. 리스트는 데이터 요소들의 크기를 예측할 수 없을 때 유용하며, 크기가 동적으로 조정될 수 있습니다. 리스트에서는 데이터 요소들이 메모리상에 연속적으로 저장되지 않으며, 각각은 링크를 통해 다음 요소와 연결되어 있습니다.

리스트는 C++의 표준 라이브러리인 STL에서 제공되는 std::list를 사용하여 구현할 수 있습니다. 리스트는 양방향 링크드 리스트(doubly linked list)로 구현되어 있으며, 데이터 요소의 삽입, 삭제, 이동이 빠르게 이루어질 수 있습니다. 예를 들어, 다음과 같이 리스트를 선언하고 사용할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <list>

std::list<int> myList;

myList.push_back(1);    // 리스트의 뒤에 요소 삽입
myList.push_front(2);   // 리스트의 앞에 요소 삽입
myList.insert(myList.begin(), 3);     // 특정 위치에 요소 삽입

myList.pop_back();      // 리스트의 뒤에서 요소 삭제
myList.pop_front();     // 리스트의 앞에서 요소 삭제
myList.erase(myList.begin());        // 특정 위치의 요소 삭제

for (int value : myList) {
    printf("%d", value);    // 리스트의 요소 출력
}

리스트는 데이터 요소의 삽입과 삭제가 자주 발생하는 경우에 유용하며, 크기가 동적으로 조정되므로 필요에 따라 요소들을 추가하거나 제거할 수 있습니다.

🐿️ Vector

참고 : https://www.programiz.com/cpp-programming/vectors

벡터(Vector)는 크기가 동적으로 조정될 수 있는 배열과 유사한 자료구조입니다. 벡터 역시 C++의 표준 라이브러리인 STL에서 제공되며, std::vector로 구현되어 있습니다. 벡터는 배열과 달리 요소의 추가, 삭제가 가능하며, 동적으로 크기가 조정되므로 저장할 수 있는 요소의 개수가 유연합니다.

벡터는 배열과 마찬가지로 0부터 시작하는 인덱스를 사용하여 요소에 접근할 수 있으며, 크기를 변경할 필요가 없으므로 메모리 관리가 자동으로 이루어집니다. 예를 들어, 다음과 같이 벡터를 선언하고 사용할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>

std::vector<int> myVector;

myVector.push_back(1);    // 벡터의 뒤에 요소 추가
myVector.push_back(2);
myVector.push_back(3);

myVector.pop_back();      // 벡터의 끝에서 요소 삭제

for (int value : myVector) {
    printf("%d", value);    // 벡터의 요소 출력
}

벡터는 배열과 유사한 형태를 가지지만 크기가 동적으로 조정될 수 있으므로, 일반적으로 배열보다 편리하게 사용할 수 있습니다.

🐿️ Queue

참고 : https://www.programiz.com/cpp-programming/queue

큐(Queue)는 선입선출(FIFO, First-In-First-Out) 방식으로 요소를 저장하는 자료구조입니다. 큐는 일상 생활에서 줄을 서는 것과 유사한 개념으로 이해할 수 있습니다. 데이터 요소는 큐의 뒤로 추가되고, 요소는 큐의 앞에서 제거됩니다.

큐는 여러 가지 방식으로 구현될 수 있으며, C++의 STL에서는 std::queue를 사용하여 구현할 수 있습니다. 큐는 데이터 요소의 삽입, 삭제가 빈번한 상황에서 유용하며, 다양한 응용 분야에서 활용됩니다. 예를 들어, 다음과 같이 큐를 선언하고 사용할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <queue>

std::queue<int> myQueue;

myQueue.push(1);      // 큐에 요소 추가
myQueue.push(2);
myQueue.push(3);

myQueue.pop();        // 큐에서 요소 삭제

while (!myQueue.empty()) {
    int value = myQueue.front();
    myQueue.pop();
    printf("%d", value);    // 큐의 요소 출력
}

큐는 데이터의 순서를 유지하면서 삽입과 삭제를 효율적으로 수행할 수 있습니다.

🐿️ Deque

참고 : https://www.programiz.com/cpp-programming/deque

덱(Deque)은 양쪽 끝에서 요소를 삽입하거나 삭제할 수 있는 자료구조입니다. 덱은 큐와 스택의 특성을 모두 가지고 있으며, 큐와 유사하게 선입선출 방식으로 요소를 저장할 수 있습니다.

덱은 C++의 STL에서 std::deque로 구현되어 있으며, 큐 및 스택의 기능을 모두 제공합니다. 예를 들어, 다음과 같이 덱을 선언하고 사용할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <deque>

std::deque<int> myDeque;

myDeque.push_back(1);       // 덱의 뒤에 요소 추가
myDeque.push_front(2);      // 덱의 앞에 요소 추가

myDeque.pop_back();         // 덱의 뒤에서 요소 삭제
myDeque.pop_front();        // 덱의 앞에서 요소 삭제

while (!myDeque.empty()) {
    int value = myDeque.front();
    myDeque.pop_front();
    printf("%d", value);     // 덱의 요소 출력
}

덱은 양쪽에서 요소의 삽입과 삭제를 효율적으로 수행할 수 있으며, 큐 및 스택의 기능을 활용할 수 있습니다.

🐿️ 예시

다음은 각 자료구조의 사용 예시입니다.

🐇 Array 예시

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main() {
  int marks[5] = {19, 10, 8, 17, 9};

  // 배열의 요소 출력
  for (int i = 0; i < 5; ++i) {
    std::cout << marks[i] << std::endl;
  }

  return 0;
}

🐇 List 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <list>

int main() {
  std::list<int> myList;

  myList.push_back(1);
  myList.push_back(2);
  myList.push_back(3);

  // 리스트의 요소 출력
  for (int value : myList) {
    std::cout << value << std::endl;
  }

  return 0;
}

🐇 Vector 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>

int main() {
  std::vector<int> myVector;

  myVector.push_back(1);
  myVector.push_back(2);
  myVector.push_back(3);

  // 벡터의 요소 출력
  for (int value : myVector) {
    std::cout << value << std::endl;
  }

  return 0;
}

🐇 Queue 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <queue>

int main() {
  std::queue<int> myQueue;

  myQueue.push(1);
  myQueue.push(2);
  myQueue.push(3);

  // 큐의 요소 출력
  while (!myQueue.empty()) {
    std::cout << myQueue.front() << std::endl;
    myQueue.pop();
  }

  return 0;
}

🐇 Deque 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <deque>

int main() {
  std::deque<int> myDeque;

  myDeque.push_back(1);
  myDeque.push_front(2);
  myDeque.push_back(3);

  // 덱의 요소 출력
  while (!myDeque.empty()) {
    std::cout << myDeque.front() << std::endl;
    myDeque.pop_front();
  }

  return 0;
}

위의 예시들은 각 자료구조들의 기본적인 사용법을 보여주고 있습니다.

요약

배열은 고정된 크기로 데이터를 관리하고, 리스트와 벡터는 크기가 동적으로 조정되는 자료구조이며, 는 선입선출 방식으로 데이터를 처리하는 자료구조입니다. 은 양쪽에서 요소를 삽입하거나 삭제할 수 있는 자료구조로, 큐와 스택의 기능을 모두 제공합니다.

이러한 자료구조들은 다양한 상황과 요구에 맞게 사용될 수 있으며, 효율적인 데이터 관리와 처리를 위해 활용됩니다.