728x90
std::array
배열, 자동으로 메모리를 할당하고 해제해준다.
Basic
[]연산자 → 배열 원소 빠른 접근, index값 유효 검사X
at() 함수→ 느린 접근, index 값 유효 검사(에러 처리 가능)
#include <iostream>
#include <array> // 헤더 추가
using namespace std;
int main() {
// 배열 선언
array<int, 4> arr1 = { 1,2,3,4 };
array<int, 5> arr2;
// 원소 접근
for (int i = 0;i < 4;i++) {
cout << arr1[i] << endl;
}
// at() : 오류 처리 가능 ([]과 차이점)
try {
cout << arr1.at(3) << endl;
cout << arr1.at(4) << endl; // 에러 발생
}
catch (const out_of_range& ex) {
cerr << ex.what() << endl; // invalid array<T, N> subscript
}
}
try catch문에서 파라미터에 const 사용이유: 객체를 변경하지 않겠다고 컴파일러에게 알려줌
Why catch an exception as reference-to-const?
array객체를 다른 함수에 전달
기본 데이터 타입과 유사
#include <iostream>
#include <array>
using namespace std;
void print(array<int,5> arr) {
for (auto e : arr) //원소 출력
cout << e << " ";
}
int main() {
array<int, 5> arr = { 1,2,3,4,5 };
print(arr);
}
전달하는 배열과 매개변수의 데이터 타입, 사이즈가 다르면 오류가 발생한다.
→ 배열 크기를 템플릿 매개변수로 전달(범용적인 배열)
#include <iostream>
#include <array>
using namespace std;
template <size_t N>
void print(array<int, N> &arr) {
for (auto e : arr) //원소 출력
cout << e << " ";
}
int main() {
array<int, 5> arr = { 1,2,3,4,5 };
print(arr);
}
레퍼런스& 를 이용해서 인자 전달시 자동으로 깊은 복사(또다시 배열 생성)되는것을 막는다
레퍼런스와 const 레퍼런스
레퍼런스: 원본 객체에 대한 포인터만 전달, 원본 전체 복제X
const + 레퍼런스: 원본 전체 복제X 또한 원본이 변경되는것을 막음
반복자, 원소 접근
#include <iostream>
#include <array>
using namespace std;
template <size_t N>
void print(array<int, N> &arr) {
for (auto e : arr) //원소 출력
cout << e << " ";
// 반복자
for (auto it = arr.begin(); it != arr.end(); it++) {
cout << *it << endl;
}
cout << arr.front() << endl; //맨 앞 원소 반환
cout << arr.back() << endl; //맨 뒤 원소 반환
cout << *arr.data() << endl; // data() : 첫번째 원소 포인터 반환
cout << *(arr.data()+1) << endl; //두번째 원소
}
int main() {
array<int, 5> arr = { 1,2,3,4,5 };
print(arr);
}
동적 크기 배열 구현하기
//동적 크기 배열 구현하기
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
template <typename T>
class dynamic_array
{
T* data;
size_t n;
public:
// 생성자
dynamic_array(int n) {
this->n = n;
data = new T[n];
}
//복사 생성자
dynamic_array(const dynamic_array<T>& other)
{
n = other.n;
data = new T[n];
for (int i=0;i<n;i++)
data[i] = other[i];
}
//데이터 접근
//[]연산자
T& operator[](int index) {
return data[index];
}
const T& operator[](int index) const {
return data[index];
}
//at 함수(index 검사)
T& at(int index)
{
if (index < n)
return data[index];
//index 초과시 에러 발생
throw "Index out of range";
}
//size() : 배열 크기 반환
size_t size() const {
return n;
}
//파괴자
~dynamic_array()
{
delete[] data;
}
//반복자
T* begin() { return data; }
const T* begin() const { return data; }
T* end() { return data + n; }
const T* end() const {
return data + n;
}
// +연산자 함수 정의
friend dynamic_array<T> operator+(const dynamic_array<T>& arr1, dynamic_array<T>& arr2)
{
dynamic_array<T> result(arr1.size() + arr2.size());
copy(arr1.begin(), arr1.end(), result.begin());
copy(arr2.begin(), arr2.end(), result.begin()+arr1.size());
return result;
}
};
//학생 구조체
struct student {
string name;
int standard;
};
// << 표준 출력 지원
ostream& operator<<(ostream& os, const student& s)
{
return (os << "[" << s.name << "," << s.standard << "]");
}
int main() {
int nStudent;
cout << "1반 학생 수 입력";
cin >> nStudent;
;
dynamic_array<student> class1(nStudent);
for (int i = 0;i < nStudent;i++) {
string name;
int standard;
cout << i + 1 << "번째 학생 이름과 나이 입력하세요";
cin >> name >> standard;
class1[i] = student{ name, standard };
}
//깊은 복사
auto class2 = class1;
cout << "1반 복사하여 2반 생성" << endl;
auto class3 = class1 + class2;
cout << "1반과 2반을 합쳐 3반 생성" << endl;
return 0;
}
copy함수 : 내용 복사시 사용한다
728x90
'알고리즘 > C++' 카테고리의 다른 글
알고리즘 암기할 코드들 (0) | 2022.12.27 |
---|---|
0주차: 재귀, 순열, 조합, split (1) | 2022.12.27 |
std::deque(덱) (0) | 2022.12.26 |
std::list (0) | 2022.12.26 |
std::vector (0) | 2022.12.26 |