C++의 병렬 배열 데이터 구조
이 기사에서는 C++에서 병렬 배열 데이터 구조를 구현하는 방법을 보여줍니다.
std::vector 컨테이너를 사용하여 C++에서 사용자 지정 병렬 배열 클래스 구현
병렬 배열은 각각 전체 엔터티로 액세스할 수 있는 여러 레코드의 배열을 구현하는 추상 데이터 구조입니다. 기본적으로 해당 요소에 병렬로 액세스할 수 있는 동일한 크기의 여러 배열을 상상해야 합니다. 이 데이터 구조는 배열 중 하나가 정렬되면 발견된 요소와 동일한 인덱스의 해당 요소에 액세스할 수 있으므로 비교적 빠른 요소 검색 작업을 제공할 수 있습니다.
병렬 배열은 다른 방법을 사용하여 구현할 수 있습니다. 이 경우 개념을 더 잘 설명하는 가장 쉬운 방법으로 std::vector STL 컨테이너를 선택했습니다.
구현을 단순화하기 위해 두 개의 구체적인 유형 배열(string 및 int)만 저장하도록 ParallelArray 클래스를 정의합니다. 클래스에는 데이터 구조 내용을 저장하는 std::vector 유형의 두 private 데이터 멤버가 포함됩니다. 내부 배열의 예상 크기를 받아들이고 std::vector::reserve 함수를 호출하여 미리 충분한 메모리를 할당하도록 단일 생성자가 정의됩니다. 이 매개변수는 선택사항이며 기본값은 20입니다.
ParallelArray 유형의 객체를 초기화하면 push_back 멤버 함수를 사용하여 데이터를 해당 객체에 푸시해야 합니다. 이 멤버 함수는 vector 멤버인 v1과 v2에 대해 동일한 이름을 가진 해당 멤버 함수를 호출합니다. 또한 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}
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