So sánh mảng trong C++ | Laptrinhcanban.com

So sánh mảng trong C++

Cùng tìm hiểu về cách so sánh mảng trong C++. Bạn sẽ học được cách so sánh 2 mảng trong C++ sau bài học này.

Có 2 phương pháp so sánh 2 mảng trong C++ như sau:

  • So sánh 2 mảng trong C++ bằng cách đối chiếu từng cặp phần tử
  • So sánh 2 mảng trong C++ bằng hàm memcmp

Lại nữa, các phương pháp này được dùng để so sánh mảng số trong C++. Để so sánh 2 mảng chuỗi, bạn có thể tham khảo bài viết sau:

Logic so sánh mảng trong C++

Để so sánh 2 mảng trong C++, điều kiện đầu tiên là 2 mảng đó cần phải có kiểu dữ liệu giống nhau. Ví dụ chúng ta có thể so sánh một mảng có kiểu int với một mảng khác có cùng kiểu int, nhưng lại không thể so sánh với một mảng khác nữa có kiểu float chẳng hạn.

Khác với khi so sánh 2 số, bạn không thể sử dụng các toán tử so sánh như = hay != với mảng trong C++ được. Nếu chúng ta sử dụng các toán tử so sánh để so sánh mảng, thì kết quả trả về sẽ không được như mong đợi như sau:

#include <iostream>
using namespace std;

int main()
{
int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 4};
int array3[] = {0, 1, 2, 3, 4};
int array4[] = {0, 1, 2, 3, 4, 5};

cout << (array1 == array1) <<endl;
cout << (array1 == array2) <<endl;
cout << (array1 == array3) <<endl;
cout << (array1 == array4) <<endl;

return 0;
}

Kết quả:

1
0
0
0

Trong đó 1 nghĩa là true (đúng) và 0 nghĩa là false (sai).

Có thể thấy trong phép so sánh thứ 3 đã không đưa ra được kết quả chính xác.

Để so sánh mảng trong C++, chúng ta không thể so sánh trực tiếp chúng như trên, mà cần phải so sánh từng cặp phần tử của chúng tại cùng vị trí index với nhau, hoặc là chuyển các mảng này sang dạng con trỏ của mảng, rồi tiến hành so sánh địa chỉ (address) của chúng trong bộ nhớ, với một trong 2 phương pháp mà Kiyoshi sẽ trình bày ở dưới đây.

So sánh mảng trong C++ bằng cách đối chiếu từng cặp phần tử

Cách đầu tiên và đơn giản, dễ hiểu nhất để so sánh mảng trong C++, đó chính là đối chiếu và kiểm tra từng cặp phần tử trong 2 mảng với nhau.

Nếu tất cả các cặp phần tử với vị trí tương ứng trong 2 mảng đều giống nhau thì hai mảng đó là bằng nhau. Ngược lại chỉ cần tồn tại một cặp phần tử có giá trị khác nhau, điều đó có nghĩa là 2 mảng đã cho không giống nhau.

Chúng ta sẽ sử dụng tới vòng lặp for với từng cặp phần tử và viết hàm trong chương trình so sánh mảng trong C++ như sau:

#include <cassert>
#include <cstdbool>
#include <iostream>
using namespace std;

/*Tạo macro SIZE_OF_ARRAY để lấy độ dài (số phần tử) của mảng chỉ định*/
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))


/*Hàm so sánh 2 mảng trong C++*/
int array_equal(const int* array1, size_t size1, const int* array2, size_t size2){
//flag = 1 => 2 mảng đã cho giống nhau
//flag = 0 => 2 mảng đã cho khác nhau

int flag = 1;

/*Kiểm tra đối số truyền vào mảng có thỏa mãn điều kiện chạy hàm không*/
assert(array1 != NULL);
assert(array2 != NULL);
assert(size1 != 0);
assert(size2 != 0);

/*Nếu số phần tử của 2 mảng khác nhau, thì chúng sẽ khác nhau*/
if (size1 != size2) return flag = 0;


/*Kiểm tra từng cặp phần tử tương ứng xem có cặp nào khác nhau không*/
for (size_t i = 0; i < size1; ++i) {
if (array1[i] != array2[i]) return flag = 0;

}
return flag;
}

int main()
{
int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 4};
int array3[] = {0, 1, 2, 3, 4};
int array4[] = {0, 1, 2, 3, 4, 5};

cout << array_equal(array1, SIZE_OF_ARRAY(array1), array1, SIZE_OF_ARRAY(array1))<< endl ; ;
cout << array_equal(array1, SIZE_OF_ARRAY(array1), array2, SIZE_OF_ARRAY(array2))<< endl ; ;
cout << array_equal(array1, SIZE_OF_ARRAY(array1), array3, SIZE_OF_ARRAY(array3))<< endl ; ;
cout << array_equal(array1, SIZE_OF_ARRAY(array1), array4, SIZE_OF_ARRAY(array4))<< endl ; ;

return 0;
}

Kết quả phép so sánh mảng trong C++:

1
0
1
0

So sánh mảng trong C++ bằng hàm memcmp

Ngoài cách so sánh từng cặp phần tử trong 2 mảng như trên, chúng ta cũng có thể sử dụng hàm có sẵn memcmp để so sánh 2 mảng trong C++.

Hàm memcmp là một hàm trong header file cstring, vốn được sử dụng để so sánh nội dung của các vùng trên bộ nhớ với nhau. Ứng dụng hàm này, chúng ta có thể so sánh các vùng trên bộ nhớ được sử dụng để chứa các mảng, và qua đó có thể so sánh gián tiếp mảng trong C++.

Chúng ta sử dụng hàm memcmp với cú pháp sau đây:

int memcmp(const void* s1, const void* s2, size_t size);

Trong đó:

  • s1, s2 là tên hai mảng cần so sánh, và chúng ta không chỉ định trực tiếp 2 mảng này trong đối số của hàm, mà sẽ sử dụng con trỏ mảng của chúng.
  • size là phạm vi so sánh trên bộ nhớ (byte). Lưu ý đây là phạm vi tính bởi byte chứ không phải là số phần tử trong mảng đâu nhé.

Hàm memcmp thường được sử dụng để so sánh quan hệ lớn nhỏ giữa 2 vùng trong bộ nhớ, tuy nhiên bằng cách kiểm tra giá trị trả về của nó là 0 hay là một số khác 0 thì chúng ta cũng có thể so sánh xem 2 mảng trong C++ có giống nhau hay không.

Và chúng ta viết chương trình so sánh 2 mảng trong C++ bằng hàm memcmp như sau:

#include <cassert>
#include <cstdbool>
#include <iostream>
#include <cstring>
using namespace std;

/*Tạo macro SIZE_OF_ARRAY để lấy độ dài (số phần tử) của mảng chỉ định*/
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

bool array_equal(const int* array1, size_t size1, const int* array2, size_t size2)
{
assert(array1 != NULL);
assert(array2 != NULL);
assert(size1 != 0);
assert(size2 != 0);

/*Nếu số phần tử của 2 mảng khác nhau, thì chúng sẽ khác nhau*/
if (size1 != size2) {
return false;
}

/*So sánh 2 vùng bộ nhớ chứa 2 mảng trên bằng hàm memcmp*/
return memcmp(array1, array2, size1 * sizeof(int)) == 0;
}

int main()
{
int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 4};
int array3[] = {0, 1, 2, 3, 4};
int array4[] = {0, 1, 2, 3, 4, 5};

cout << array_equal(array1, SIZE_OF_ARRAY(array1), array1, SIZE_OF_ARRAY(array1))<< endl ; ;
cout << array_equal(array1, SIZE_OF_ARRAY(array1), array2, SIZE_OF_ARRAY(array2))<< endl ; ;
cout << array_equal(array1, SIZE_OF_ARRAY(array1), array3, SIZE_OF_ARRAY(array3))<< endl ; ;
cout << array_equal(array1, SIZE_OF_ARRAY(array1), array4, SIZE_OF_ARRAY(array4))<< endl ; ;

return 0;
}

Kết quả phép so sánh mảng trong C++:

1
0
1
0

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách so sánh mảng trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.