2012-12-18 29 views
10

Làm cách nào để tôi có thể tiến hành std::find trên một mảng kế thừa mà không cần tạo std::vector/std::array mới từ mảng cũ hiện có?std :: tìm trên một mảng kế thừa

ví dụ:

int ar[N]; 

if (std::find(ar, ar + N, value) != &ar[N]){ /**/ } 

&ar[N] một giá trị hợp lệ để kiểm tra tình hình khi không có gì được tìm thấy? Tôi có thể chắc chắn tôi đang làm đúng bằng cách sử dụng &ar[N] như một tương tự của std::vector::end()?

Trả lời

19

Nếu bạn đang sử dụng C++ 11, bạn có thể sử dụng:

int arr[N]; 
if (std::end(arr) == std::find(std::begin(arr), std::end(arr), value)) 
{ 
    // ... 
} 

Đối với C++ 98, bạn có thể sử dụng:

int arr[N]; 
int *begin = arr; 
int *end = begin + N; 

if (end == std::find(begin, end, value)) 
{ 
    // ... 
} 
+3

Không khó để viết phiên bản 'std :: begin' và' std :: end' của riêng bạn. –

+0

@BenVoigt, tôi đã cập nhật mã. – utnapistim

+0

để thêm vào đánh dấu nhận xét, cũng tăng cung cấp bắt đầu và kết thúc quá. – 111111

2

Là & ar [N] một giá trị hợp lệ để kiểm tra tình huống khi không tìm thấy gì?

Bạn có thể sử dụng ar+N thay vì &ar[N], vì ar +N là an toàn nhưng &ar[N] rơi vào khu vực của hành vi undefined (có một cuộc tranh luận dài hơn rằng trong thực tế).

nói Ngữ nghĩa, đối số thứ hai là thựccuối của dãy núi này, vì vậy bất cứ bạn vượt qua như là đối số thứ hai được trả về khi được tìm thấy trong phạm vi. Trong trường hợp của bạn, ar + N là đối số thứ hai, cũng cho biết kết thúc của dải ô. Vì vậy, bạn có thể viết điều này:

if (std::find(ar, ar + N, value) != (ar + N)) 
{ 
     //value found 
} 
+1

Bạn có chắc chắn '& ar [N]' là hợp pháp không? Nó không liên quan đến dereferencing? –

+0

@LuchianGrigore: Đó là một cuộc tranh luận dài nhưng kết luận thông thường là có lợi. – Nawaz

+1

Có ngôn ngữ đặc biệt cho con trỏ cho phép địa chỉ của phần tử qua cuối có ý nghĩa. Không có hành vi đặc biệt nào được kích hoạt cho các tham chiếu, 'ar [N]' tạo ra hành vi không xác định trong bất kỳ ngữ cảnh được đánh giá nào, bao gồm '& ar [N]'. –

3

Ý tưởng chung của bạn là tốt. Nhưng ar[N] không phải là "dành riêng" cho bạn. Dereferencing một biến không được phân bổ sẽ dẫn đến hành vi không xác định. Bạn muốn so sánh kết quả std::find với ar + N, điều này không liên quan đến dereferencing.

+1

Câu đầu tiên của bạn là "Giải pháp của bạn là tốt". nhưng sau đó bạn nói nó thực sự không tốt. Đó là cái nào? –

+0

Kiểm tra địa chỉ của ar [N] thực sự là một giải pháp tốt. Nhưng, anh ta không cần phải dereference nó. Xin lỗi nếu tôi đã không làm cho bản thân mình rõ ràng. – tomahh

+0

Bạn đang nói "giải pháp của bạn tốt". Giải pháp của anh ta liên quan đến '& ar [N]', rõ ràng là không tốt.Ngoài ra "Derefenrencing một biến không được phân bổ có thể dẫn đến hành vi không xác định." ngụ ý rằng có những tình huống mà nó sẽ không dẫn đến UB, một lần nữa là sai. –

2

Không, ar[N] dereferences một yếu tố sau khi kết thúc của mảng, vì vậy nó là bất hợp pháp.

Hãy nhớ rằng ar[N] tương đương với *(ar + N) - vì vậy rõ ràng đây là một điều không quan tâm.

Đi với ar + N thay thế. Đó là hợp pháp để có một con trỏ 1 sau khi kết thúc một mảng, nó là bất hợp pháp để dereference nó.

Các vấn đề liên quan