Khái niệm
Mảng là cấu trúc dữ liệu lưu nhiều phần tử cùng loại theo một thứ tự xác định. Mỗi phần tử được truy cập thông qua chỉ số, vì vậy mảng rất phù hợp với các bài toán duyệt tuần tự và lưu dữ liệu có kích thước biết trước.
Ví dụ truy cập phần tử
numbers = [10, 20, 30]
print(numbers[1])
program ArrayDemo;
var
numbers: array[1..3] of Integer = (10, 20, 30);
begin
Writeln(numbers[2]);
end.
#include <stdio.h>
int main(void) {
int numbers[] = {10, 20, 30};
printf("%d\n", numbers[1]);
return 0;
}
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 3> numbers = {10, 20, 30};
cout << numbers[1] << endl;
return 0;
}
int[] numbers = { 10, 20, 30 };
Console.WriteLine(numbers[1]);
const numbers = [10, 20, 30];
console.log(numbers[1]);
const numbers: number[] = [10, 20, 30];
console.log(numbers[1]);
package main
import "fmt"
func main() {
numbers := [3]int{10, 20, 30}
fmt.Println(numbers[1])
}
fn main() {
let numbers = [10, 20, 30];
println!("{}", numbers[1]);
}
Điều cần chú ý
- Cần đặc biệt chú ý giới hạn chỉ số để tránh lỗi truy cập ngoài phạm vi.
Ghi chú theo ngôn ngữ
Danh sách trong Python linh hoạt hơn mảng tĩnh truyền thống vì có thể thay đổi kích thước trong lúc chạy. Tuy vậy, khi học nhập môn vẫn có thể xem nó như dạng mảng động dễ dùng.
Pascal cổ điển thường dùng mảng có kích thước xác định ngay khi khai báo. Chỉ số mặc định trong ví dụ bắt đầu từ 1, không phải 0.
C không tự kiểm tra biên mảng ở thời gian chạy. Vì vậy người viết phải tự đảm bảo chỉ số luôn nằm trong phạm vi hợp lệ.
C++ có std::array (cố định) và std::vector (linh hoạt). std::array::at() kiểm tra biên an toàn hơn so với operator[].
C# kiểm tra biên mảng ở thời gian chạy và ném IndexOutOfRangeException nếu truy cập ngoài biên. Đây là hành vi an toàn mặc định.
JavaScript không có mảng cố định; Array mặc định là linh hoạt. Truy cập ngoài biên trả về undefined thay vì báo lỗi.
TypeScript bổ sung cú pháp number[] hoặc Array<number>. Kiểu chỉ kiểm tra tại biên dịch, không bảo vệ khỏi truy cập ngoài biên ở thời gian chạy.
Go phân biệt mảng (array) và slice. Slice linh hoạt hơn và thường được dùng nhiều hơn trong thực tế. Cả hai đều kiểm tra biên tự động khi chạy.
Rust có mảng cố định và Vec<T> linh hoạt. Truy cập ngoài biên gây panic ở thời gian chạy. Dùng .get(index) để truy cập an toàn trả về Option.
Kết luận
Mảng là cấu trúc dữ liệu nền tảng nhất. Các thuật toán sắp xếp và tìm kiếm trong mục Thuật toán đều vận hành trực tiếp trên mảng. Biểu diễn đồ thị bằng ma trận kề cũng là một ứng dụng quan trọng của mảng 2D.
Bình luận