C++의 병렬 배열 데이터 구조

Jinku Hu 2023년10월12일
C++의 병렬 배열 데이터 구조

이 기사에서는 C++에서 병렬 배열 데이터 구조를 구현하는 방법을 보여줍니다.

std::vector 컨테이너를 사용하여 C++에서 사용자 지정 병렬 배열 클래스 구현

병렬 배열은 각각 전체 엔터티로 액세스할 수 있는 여러 레코드의 배열을 구현하는 추상 데이터 구조입니다. 기본적으로 해당 요소에 병렬로 액세스할 수 있는 동일한 크기의 여러 배열을 상상해야 합니다. 이 데이터 구조는 배열 중 하나가 정렬되면 발견된 요소와 동일한 인덱스의 해당 요소에 액세스할 수 있으므로 비교적 빠른 요소 검색 작업을 제공할 수 있습니다.

병렬 배열은 다른 방법을 사용하여 구현할 수 있습니다. 이 경우 개념을 더 잘 설명하는 가장 쉬운 방법으로 std::vector STL 컨테이너를 선택했습니다.

구현을 단순화하기 위해 두 개의 구체적인 유형 배열(stringint)만 저장하도록 ParallelArray 클래스를 정의합니다. 클래스에는 데이터 구조 내용을 저장하는 std::vector 유형의 두 private 데이터 멤버가 포함됩니다. 내부 배열의 예상 크기를 받아들이고 std::vector::reserve 함수를 호출하여 미리 충분한 메모리를 할당하도록 단일 생성자가 정의됩니다. 이 매개변수는 선택사항이며 기본값은 20입니다.

ParallelArray 유형의 객체를 초기화하면 push_back 멤버 함수를 사용하여 데이터를 해당 객체에 푸시해야 합니다. 이 멤버 함수는 vector 멤버인 v1v2에 대해 동일한 이름을 가진 해당 멤버 함수를 호출합니다. 또한 ParallelArray 개체의 현재 요소 수를 검색하기 위해 size라는 멤버 함수를 정의했습니다.

클래스에는 구조에 저장된 요소에 액세스하도록 정의된 [] 연산자도 있습니다. operator[]ParallelArray에 고정 데이터 유형의 배열이 있으므로 std::pair<string, int> 값을 반환합니다. 또는 내부 vector 개체를 초기화하고 이에 따라 멤버 함수를 다시 작성하기 위해 여러 일반 유형을 허용하도록 클래스 템플릿을 구성할 수 있습니다. 클래스가 두 개 이상의 내부 vector 데이터 멤버를 선언하는 경우 operator[]는 STL의 std::make_tuple 메서드를 사용하여 요소를 반환할 수 있습니다.

#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

class ParallelArray {
 public:
  explicit ParallelArray(size_t size = 20) {
    v1.reserve(size);
    v2.reserve(size);
  };

  void push_back(string &d1, int d2);
  size_t size();
  std::pair<string, int> operator[](size_t pos);

 private:
  vector<string> v1;
  vector<int> v2;
};

void ParallelArray::push_back(string &d1, int d2) {
  v1.push_back(d1);
  v2.push_back(d2);
}

std::pair<string, int> ParallelArray::operator[](size_t pos) {
  if (pos <= v1.size()) {
    return std::make_pair(v1[pos], v2[pos]);
  } else {
    return std::make_pair("null", -1);
  }
}

size_t ParallelArray::size() { return v1.size(); }

template <typename T1, typename T2>
void printPair(const std::pair<T1, T2> &pp) {
  cout << "{" << pp.first << "," << pp.second << "}" << endl;
}

int main() {
  ParallelArray pa1;

  vector<string> data_set1 = {"Precise", "Quantal", "Saucy", "Raring"};

  vector<int> data_set2 = {11, 22, 33, 44};

  for (size_t i = 0; i < data_set1.size(); ++i) {
    pa1.push_back(data_set1[i], data_set2[i]);
  }

  for (size_t i = 0; i < pa1.size(); ++i) {
    printPair(pa1[i]);
  }

  return EXIT_SUCCESS;
}

출력:

{Precise,11}
{Quantal,22}
{Saucy,33}
{Raring,44}

두 코드 조각 모두에서 ParallelArray 개체를 구성한 다음 클래스의 내용을 인쇄하는 main 함수의 일부로 기본 드라이버 코드를 구현합니다. printPair 도우미 기능은 std::pair 개체의 값을 콘솔에 표시하는 데 사용됩니다.

또한 pop_back 멤버 함수를 추가하여 각 vector 데이터 멤버의 끝에서 저장된 요소를 제거할 수 있습니다. pop_back 함수는 매개변수를 허용하지 않고 std::vector::pop_back 함수를 호출합니다. 후자 함수의 사용법은 다음 코드 예제에서 보여줍니다.

#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

class ParallelArray {
 public:
  explicit ParallelArray(size_t size = 20) {
    v1.reserve(size);
    v2.reserve(size);
  };

  void push_back(string &d1, int d2);
  void pop_back();
  size_t size();
  std::pair<string, int> operator[](size_t pos);

 private:
  vector<string> v1;
  vector<int> v2;
};

void ParallelArray::push_back(string &d1, int d2) {
  v1.push_back(d1);
  v2.push_back(d2);
}

std::pair<string, int> ParallelArray::operator[](size_t pos) {
  if (pos <= v1.size()) {
    return std::make_pair(v1[pos], v2[pos]);
  } else {
    return std::make_pair("null", -1);
  }
}

size_t ParallelArray::size() { return v1.size(); }

void ParallelArray::pop_back() {
  v1.pop_back();
  v2.pop_back();
}

template <typename T1, typename T2>
void printPair(const std::pair<T1, T2> &pp) {
  cout << "{" << pp.first << "," << pp.second << "}" << endl;
}

int main() {
  ParallelArray pa1;

  vector<string> data_set1 = {"Precise", "Quantal", "Saucy", "Raring"};

  vector<int> data_set2 = {11, 22, 33, 44};

  for (size_t i = 0; i < data_set1.size(); ++i) {
    pa1.push_back(data_set1[i], data_set2[i]);
  }

  for (size_t i = 0; i < pa1.size(); ++i) {
    printPair(pa1[i]);
  }

  pa1.pop_back();
  pa1.pop_back();

  cout << "------------------------" << endl;
  for (size_t i = 0; i < pa1.size(); ++i) {
    printPair(pa1[i]);
  }

  return EXIT_SUCCESS;
}

출력:

{Precise,11}
{Quantal,22}
{Saucy,33}
{Raring,44}
------------------------
{Precise,11}
{Quantal,22}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Array