사실 가장 확실하며 실수할 가능성도 없다. 코드가 길어질 뿐이지만 이도 함수를 사용하면 뭐 큰 차이는 없다.
속도의 이슈가 조금 있다. 이는 아래 본문에서 소개하겠다.
그래서 속도상 이점, 코드상으로 간결함을 추구해서 표준함수를 사용한다. 이게 copy함수이다.
c에서 배열복제는 memcpy라는 매우 로우한 함수를 사용해서 배열을 복재해냈다.
사실 뭐 배열 복제만 하면되니 로우하건말건 크게 중요하진 않다.
그러나 cpp에서는 다른 방식으로 복제할 수 있다.
그대로 c에서 처럼 memcpy를 써도 큰 문제는 없다.
그러나 이 방식은 cpp에서 권장하는 방식이 아니므로 큰 이유가 없다면 cpp에서 권장하는 방법을 사용하자.
인터넷을 뒤져보면 for이 빠르냐 copy를 빠르냐 물어보는 사람이 있다.
거기에 대한 답을 하기전에 먼저 코드를 보도록 하자.
#include <iostream> #include <algorithm> #include <ctime> #define ul unsigned long #define ARR_SIZE 100*100*100*100 using namespace std; int arr1[ARR_SIZE]; int arr2[ARR_SIZE]; void set_arr(int *a) { for (int i = 0; i < ARR_SIZE; i++) { a[i] = i; } }
void print_arr(int *a) { for (int i = 0; i < ARR_SIZE; i++) { cout << a[i] << " "; if (i % 10 == 9) { cout << endl; } } }
int main() { ul start, end; // set_arr(arr1); start = clock(); for (int i = 0; i < ARR_SIZE; i++) { arr2[i] = arr1[i]; } end = clock(); // print_arr(arr2); cout << endl << end - start << "us" << endl; return 0; }
먼저 for문으로 돌려보자. 자료는 100,000,000개로 총 1억개이다.
1억개를 복제하는 코드로 결과를 보고싶으면 저 주석 두개를 지워주면 된다.
참고로 출력을 하게 되면 시간이 좀 많이걸린다. 그래봤자 1분이 걸리지는 않으니 결과를 보고싶다면 보면된다.
약 0.57초 정도 걸린다.
이제 copy함수를 보도록하자.
#include <iostream> #include <algorithm> #include <ctime> #define ul unsigned long #define ARR_SIZE 100*100*100*100 using namespace std; int arr1[ARR_SIZE]; int arr2[ARR_SIZE]; void set_arr(int *a) { for (int i = 0; i < ARR_SIZE; i++) { a[i] = i; } }
void print_arr(int *a) { for (int i = 0; i < ARR_SIZE; i++) { cout << a[i] << " "; if (i % 10 == 9) { cout << endl; } } }
int main() { ul start, end; // set_arr(arr1); start = clock(); copy(arr1, arr1 + ARR_SIZE, arr2); end = clock(); // print_arr(arr2); cout << endl << end - start << "us" << endl; return 0; }
copy함수를 사용해서 시간이 얼마나 걸릴까?
다시 측정 해보도록하자.
0.40초 정도 걸렸다.
전반적으로 보면 for문이 copy보다 느리다는 것을 볼 수 있다.
사실 이는 조건을 조금만 달리하면 좀더 좁힐 수는 있다. 그러나 전반적으로 for문이 copy보다 느리다는 것을 알 수 있다.
이는 언어에서 복사하는 함수를 제공해주는 이유기도 하다.
그러나 사실 알고리즘을 풀거나 이런분은 크게 고민할 필요없이 상황에 맞춰서 쓰면된다.
왜냐하면 보면 알겠지만 for문을 쓰는게 copy보다 느려봣자 1억개에 0.2초밖에 차이가 안난다..
#include <iostream> #include <algorithm> #define ARR_SIZE 5 using namespace std; int arr1[ARR_SIZE] = {1, 2, 3, 4, 5}; int arr2[ARR_SIZE]; void print_arr(int *arr) { for (int i = 0; i < ARR_SIZE; i++) { cout << arr[i] << " "; } cout << endl; }