2010-10-23 32 views
9

Tôi hiện đang nhìn thấy rất nhiều câu hỏi được gắn thẻ C++ và sắp xử lý mảng.
Thậm chí còn có những câu hỏi hỏi về các phương pháp/tính năng cho các mảng mà std::vector sẽ cung cấp mà không có bất kỳ phép thuật nào.Ưu điểm của việc sử dụng mảng thay vì std :: vector?

Vì vậy, tôi tự hỏi tại sao rất nhiều nhà phát triển đang chọn các mảng trên std::vector bằng C++?

Trả lời

9

Nói chung, tôi đặc biệt thích sử dụng một véc tơ trên một mảng cho công việc không tầm thường; tuy nhiên, có một số ưu điểm của mảng.

  • mảng hơi nhỏ gọn hơn: kích thước là tiềm ẩn
  • mảng đều là phòng không thay đổi kích thước; đôi khi điều này là tuyệt
  • mảng không yêu cầu phân tích tiêu đề STL thêm (thời gian biên dịch)
  • nó có thể được dễ dàng hơn để tương tác với mã thẳng-C với một mảng (ví dụ nếu C được phân bổ và C++ đang sử dụng)
  • mảng kích thước cố định có thể được nhúng trực tiếp vào cấu trúc hoặc đối tượng, có thể cải thiện vị trí bộ nhớ và giảm số lượng phân bổ heap cần thiết
+2

Ngoài ra: * mảng nhanh hơn; * Các mảng có thể được khởi tạo tĩnh (trong khi các vectơ luôn được khởi động động, lúc chạy) – mojuba

+10

Đó là lý do "rất nhiều nhà phát triển đang chọn mảng trên std :: vector trong C++" chỉ vì họ đọc một số sách cũ/xấu và bây giờ không muốn chuyển sang cấp độ lập trình mới. Tôi nghi ngờ nhiều người thậm chí còn xem xét bất kỳ điểm nào của bạn trước khi quyết định sử dụng mảng. Ngoài ra không có vấn đề gì vector cung cấp, bất kỳ lập trình viên về mặt lý thuyết có thể sử dụng mảng, bởi vì nếu bạn không hiểu con trỏ và số học của họ bạn không thể là một lập trình viên C++ tốt –

4

Vì C++ 03 không có chữ vectơ. Sử dụng mảng đôi khi có thể tạo ra mã ngắn gọn hơn.

So với mảng khởi tạo:

char arr[4] = {'A', 'B', 'C', 'D'}; 

vector khởi tạo có thể nhìn hơi dài dòng

std::vector<char> v; 
v.push_back('A'); 
v.push_back('B'); 
... 
1

Tôi nghĩ rằng điều này là bởi vì rất nhiều lập trình viên C++ đến từ C và chưa hiểu những lợi thế của việc sử dụng vector và tất cả các tính năng bổ sung STL bổ sung miễn phí với các thùng chứa của nó.

+0

Bạn có thể đúng. Nhưng bạn vẫn có thể sử dụng một số tính năng bổ sung (thuật toán STL) với mảng. –

1

Bạn có quyền kiểm soát nhiều hơn nữa với các mảng

Làm thế nào về:

1), bạn đang đối phó với các tập dữ liệu khổng lồ nơi dữ liệu phải được ánh xạ tập tin và không được phân bổ với malloc hoặc new bởi vì kích thước của nó . Trong kịch bản này lo lắng về việc phải làm gì nếu bạn không đặt đủ không gian địa chỉ ngay từ đầu có thể là tranh luận, mặc dù tôi cho rằng bạn có thể unmap - extend - remap tệp, trừ khi bị phân mảnh theo địa chỉ hoặc điểm thứ hai của tôi.

2) Mã sử ​​dụng đa xử lý không khóa. Hiệu suất truy cập dừng các luồng để phân bổ lại (hoặc bất kỳ "STL goodie" khác) có thể không được chấp nhận, do đó sử dụng mảng, bạn có quyền kiểm soát nhiều hơn, bạn có thể cần phải gọi rất nhiều chức năng để tạm dừng các luồng khác trước khi bạn thay đổi kích thước bất cứ điều gì.

BTW, tôi thường xử lý 1 và 2 cùng một lúc. Mảng của cấu trúc + con trỏ làm việc tuyệt vời, Biên dịch với C++ vì bạn vẫn có thể sử dụng một số tính năng C++ ở nơi khác trong mã.Tôi chắc rằng tôi có thể nghĩ ra nhiều ví dụ khác nếu tôi đã cố gắng hết sức

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