2012-11-07 34 views
5

Tôi đã xem xét một vài nguồn để triển khai STL (SGI, STLport, libC++) và thấy một vài mẫu thiết kế dường như phổ biến cho tất cả hoặc hầu hết các triển khai, nhưng tôi không tìm thấy lý do nào. Tôi giả sử có phải là một reson tốt, và muốn biết những gì nó là:Lý do thiết kế đằng sau STL

  1. Nhiều lớp học, trong đó có vectorlist_iterator số những người khác, đã được thực hiện như 2 lớp, ví dụ list_iterator_base với một phần chức năng và sau đó list_iterator kế thừa list_iterator_base với phần còn lại của giao diện. Điểm là gì? Có vẻ như nó có thể được thực hiện một cách dễ dàng trong một lớp.

  2. Các trình vòng lặp dường như không sử dụng lớp iterator. Có một số hình phạt về hiệu suất để sử dụng nó không?

Đó là 2 câu hỏi tôi tìm thấy chỉ trong một trích dẫn nhanh. Nếu bất cứ ai biết về một nguồn tài nguyên tốt giải thích lý do thực hiện của một thực hiện STL, tôi sẽ rất vui khi nghe về nó.

+0

"Tôm Jumbo". –

+0

Lưu ý rằng kỹ thuật STL và thư viện chuẩn (stdlib) là khác nhau. Sau này, phần lớn, được lấy từ phần trước khi nó được thêm vào tiêu chuẩn ngôn ngữ chính thức. Hầu như không ai sử dụng STL "đúng" nữa mà thay vào đó sử dụng các triển khai của thư viện chuẩn (ví dụ: libC++). Nhiều người nói đến stdlib như STL anyway, và điều đó thường tốt, nhưng đối với câu hỏi của bạn, sự khác biệt làm thay đổi ý nghĩa. – GManNickG

+0

@DaveNewton Tôi không hiểu nhận xét của bạn. – baruch

Trả lời

7

Những câu trả lời là khá thẳng về phía trước:

  1. STL là tất cả về lập trình generic. Ý tưởng chính là không có mã trùng lặp. Mục tiêu trước mắt là không có mã nguồn trùng lặp nhưng khi nó chỉ ra nó cũng có ý nghĩa để không trùng lặp mã nhị phân. Vì vậy, nó là khá phổ biến mà các thành phần STL yếu tố thường được sử dụng các bộ phận ra và sử dụng chúng. Các liên kết cho một lớp danh sách hoặc các thuộc tính độc lập kiểu của một vectơ chỉ là hai ví dụ. Đối với vectơ, thậm chí có nhiều lớp: một số phần hoàn toàn độc lập với loại (ví dụ: kích thước), các phần khác chỉ cần loại chính nó (ví dụ, tất cả các trình truy cập, trình vòng lặp, v.v.) và một số phần cần biết để đối phó với phân bổ tài nguyên (ví dụ, chèn và phá hủy cần phải biết về việc cấp phát đang được sử dụng).
  2. Nó chỉ ra rằng std::iterator<...> không thực sự hoạt động: Các loại được xác định trong các lớp cơ sở tùy thuộc vào tham số mẫu không thể truy cập trực tiếp trong mẫu lớp bắt nguồn từ cơ sở như vậy. Đó là, các loại cần phải được đủ điều kiện với các lớp cơ sở và cần phải được đánh dấu là loại sử dụng typename. Để làm cho vấn đề tồi tệ hơn, người dùng có thể trong lý thuyết phân bổ các đối tượng của lớp dẫn xuất và phát hành chúng thông qua một con trỏ đến std::iterator<...> (có, đó sẽ là một điều ngớ ngẩn để làm). Đó là, không có lợi ích nhưng có một nhược điểm tiềm năng, tức là, tốt nhất nên tránh.

Điều đó nói rằng, tôi không biết bất kỳ tài nguyên tốt nào bao gồm các kỹ thuật triển khai thư viện chung. Hầu hết các chi tiết được áp dụng trong việc triển khai STL được phát minh độc lập bởi nhiều người nhưng các tài liệu về Lập trình chung vẫn còn tương đối khan hiếm. Tôi không nghĩ rằng bất kỳ giấy tờ nào mô tả STL thực sự thảo luận về các kỹ thuật thực hiện: Họ thường tập trung vào các chi tiết thiết kế. Do chỉ có rất ít người có vẻ hiểu STL là gì, nên không có gì ngạc nhiên khi các tác giả có xu hướng tập trung vào việc mô tả STL là gì hơn là làm thế nào để thực hiện nó.

+0

Về điểm 2: Nếu nó không hoạt động, tại sao giữ nó lại? Tại sao nó lại được thêm vào thư viện chuẩn? – baruch

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