Chuyển tới nội dung chính

std::vector::at

#include <vector>

      reference at (size_type n);
const_reference at (size_type n) const;

Truy xuất phần tử tại vị trí chỉ định.

Tham số

n

  • Vị trí của phần tử cần truy cập (kiểu size_t).
  • Chỉ số phải nằm trong phạm vi hợp lệ của vector, từ 0 đến size() - 1.

Giá trị trả về

  • L-Value reference (nếu vector không const): cho phép sửa đổi phần tử.
  • Const reference (nếu vector là const): chỉ cho phép đọc phần tử.
  • Ném std::out_of_range nếu n nằm ngoài phạm vi hợp lệ.

Đặc điểm

  1. Hàm at() cung cấp một cách an toàn để truy cập các phần tử của vector với kiểm tra biên (Boundary Check), nghĩa là nó sẽ ném ra một ngoại lệ nếu chỉ số vượt qua giới hạn của vector.
  2. Hàm at() kiểm tra chỉ số được cung cấp. Nếu chỉ số vượt quá giới hạn của vector (out-of-range), nó sẽ ném ngoại lệ (std::out_of_range). Điều này giúp giảm thiểu lỗi runtime khi truy cập ngoài phạm vi.
  3. So với operator[], at() có chi phí cao hơn một chút do kiểm tra phạm vi, nhưng đảm bảo an toàn hơn. Toán tử operator[] không kiểm tra biên và có thể dẫn đến các lỗi khó phát hiện.
  4. Với vector không const, at() cho phép truy cập và thay đổi giá trị.
  5. Với vector const, at() chỉ cho phép truy cập giá trị.
  6. Sử dụng at() khi bạn muốn lập trình an toàn hơn, đặc biệt trong các trường hợp mà phạm vi chỉ số có thể không chắc chắn.

Ví dụ

Truy cập và thay đổi phần tử:

#include <iostream>
#include <vector>

int main() {
std::vector<int> numbers = {10, 20, 30, 40};

// Truy cập phần tử
std::cout << "Phần tử tại index 2: " << numbers.at(2) << '\n';

// Thay đổi giá trị phần tử
numbers.at(2) = 99;
std::cout << "Giá trị sau khi thay đổi: " << numbers.at(2) << '\n';

// Thử truy cập ngoài phạm vi
try {
std::cout << "Phần tử tại index 5: " << numbers.at(5) << '\n';
} catch (const std::out_of_range& e) {
std::cerr << "Lỗi: " << e.what() << '\n';
}

return 0;
}

Truy cập phần tử của vector const:

#include <iostream>
#include <vector>

int main() {
const std::vector<int> numbers = {10, 20, 30, 40};

// Truy cập phần tử
std::cout << "Phần tử tại index 1: " << numbers.at(1) << '\n';

// Không thể thay đổi giá trị
// numbers.at(1) = 50; // Lỗi biên dịch

return 0;
}

Các hàm liên quan

[]Truy xuất phần tử tại vị trí chỉ định
frontTruy xuất phần tử tại vị trí đầu tiên
backTruy xuất phần tử tại vị trí cuối cùng