Có gì khác biệt giữa Thư viện STL và Thư viện Tiêu chuẩn C ++?


446

Ai đó đã chú ý đến bài viết này rằng tôi tuyên bố (tôi đang diễn giải) thuật ngữ STL bị sử dụng sai để chỉ toàn bộ Thư viện chuẩn C ++ thay vì các phần được lấy từ SGI STL.

(...) Nó đề cập đến "STL", mặc dù thực tế là rất ít người vẫn sử dụng STL (được thiết kế tại SGI).

Các phần của Thư viện chuẩn C ++ dựa trên các phần của STL và đó là những phần mà nhiều người (bao gồm một số tác giả và cplusplus.com nổi tiếng có lỗi) vẫn gọi là "STL". Tuy nhiên, điều này là không chính xác; thật vậy, tiêu chuẩn C ++ không bao giờ đề cập đến "STL" và có sự khác biệt về nội dung giữa hai tiêu chuẩn.

(...) "STL" hiếm khi được sử dụng để chỉ các bit của stdlib xảy ra dựa trên SGI STL. Mọi người nghĩ rằng đó là toàn bộ thư viện tiêu chuẩn. Nó được đưa vào CV. Và nó là sai lệch.

Tôi hầu như không biết gì về lịch sử của C ++ vì vậy tôi không thể đánh giá tính đúng đắn của bài viết. Tôi có nên hạn chế sử dụng thuật ngữ STL không? Hay đây là một ý kiến ​​riêng biệt?


62
Mọi người cần tên tốt để mô tả mọi thứ. Thiên tài của Stepanov đã thay đổi cách chúng ta lập trình. Một cái tên như "lập trình thư viện chuẩn" hoàn toàn vô dụng để mô tả điều đó. Gọi nó là "lập trình stl" và mọi người đều hiểu ý của bạn. Lập luận về điều đó chỉ bỏ lỡ vấn đề: chúng ta cần một cái tên hay.
Hans Passant

34
@Hans: Không, bạn bỏ lỡ quan điểm: " mọi người đều hiểu ý bạn" là không đúng .
Các cuộc đua Lightness trong Orbit

16
Tôi không hiểu bạn có ý gì.
Hans Passant

21
Dưới đây là một ví dụ hoàn hảo về người đang sử dụng "STL" để chỉ toàn bộ Thư viện chuẩn C ++. Nó tiếp tục gây trở ngại cho tôi rằng rất nhiều người thề mù mà không ai từng làm điều này, khi nó đơn giản để nhìn thấy gần như hàng ngày.
Các cuộc đua nhẹ nhàng trong quỹ đạo

Câu trả lời:


571

"STL" được viết bởi Alexander Stepanov trong những ngày trước khi C ++ được chuẩn hóa. C ++ tồn tại qua những năm 80, nhưng cái mà chúng ta gọi là " C ++ " là ngôn ngữ được tiêu chuẩn hóa trong ISO / IEC 14882: 2014 (và các phiên bản trước đó, chẳng hạn như ISO / IEC 14882: 2011).

STL đã được sử dụng rộng rãi như một thư viện cho C ++, cho phép các lập trình viên truy cập vào các thùng chứa, các trình lặp và thuật toán. Khi tiêu chuẩn hóa xảy ra, ủy ban ngôn ngữ đã thiết kế các phần của Thư viện chuẩn C ++ (là một phần của tiêu chuẩn ngôn ngữ) để rất khớp với STL.

Trong những năm qua, nhiều người - bao gồm các tác giả sách nổi tiếng và các trang web khác nhau - đã tiếp tục gọi Thư viện tiêu chuẩn C ++ là "STL", mặc dù thực tế là hai thực thể riêng biệt và có một số khác biệt. Những khác biệt này thậm chí còn rõ rệt hơn trong tiêu chuẩn C ++ mới sắp ra mắt, bao gồm các tính năng khác nhau và làm thay đổi đáng kể một số lớp.

STL ban đầu thường được gọi là "triển khai Thư viện mẫu tiêu chuẩn C ++" (ngược với lịch sử thực tế!), Giống như cách Microsoft Visual Studio hoặc GCC của bạn triển khai Thư viện chuẩn C ++. Nhưng "Thư viện mẫu tiêu chuẩn" và "Thư viện chuẩn" không giống nhau.

Trận chiến là về việc Thư viện tiêu chuẩn hiện tại nên được gọi là "STL" toàn bộ hay một phần, và / hoặc liệu nó có quan trọng với những gì nó được gọi hay không.

Đối với "STL"

Có một trường phái cho rằng mọi người đều biết rằng "STL" có nghĩa là thư viện chuẩn, giống như mọi người đều biết rằng "C ++" là ngôn ngữ được tiêu chuẩn hóa ISO.

Nó cũng bao gồm những người tin rằng nó không thực sự quan trọng miễn là tất cả các bên hiểu những gì đang được nói đến.

Đó là một thuật ngữ thậm chí còn phổ biến hơn bởi bản chất của quái thú, phần lớn sử dụng tính năng C ++ được gọi là "mẫu".

Đối với "Thư viện chuẩn C ++" (hoặc stdlib)

Tuy nhiên, có một trường phái khác về suy nghĩ - mà tôi đăng ký - nói rằng điều này thật khó hiểu. Những người học C ++ lần đầu tiên không biết sự khác biệt này và có thể không nhận thấy sự khác biệt ngôn ngữ nhỏ.

Tác giả của bài viết đó đã nhiều lần bắt gặp những người tin rằng toàn bộ Thư viện chuẩn C ++ STL, bao gồm các tính năng không bao giờ là một phần của chính STL. Hầu hết những người đề xướng "STL", ngược lại, biết chính xác ý nghĩa của nó và từ chối tin rằng không phải ai cũng "hiểu". Rõ ràng, thuật ngữ sử dụng không thống nhất.

Ngoài ra, có một số thư viện giống STL trên thực tế là triển khai STL gốc, không phải Thư viện chuẩn C ++. Cho đến gần đây, STLPort là một trong số đó (và thậm chí ở đó, sự nhầm lẫn rất nhiều!).

Hơn nữa, Tiêu chuẩn C ++ không chứa văn bản "STL" ở bất cứ đâu và một số người thường sử dụng các cụm từ như "STL được bao gồm trong Thư viện chuẩn C ++", không rõ ràng.

Tôi tin rằng việc tiếp tục tuyên truyền việc sử dụng thuật ngữ theo cách này sẽ chỉ dẫn đến sự hiểu lầm xảy ra mãi mãi. Than ôi, nó có thể hoàn toàn phản tác dụng khi cố gắng thay đổi mọi thứ, ngay cả khi nó được cho là tốt hơn. Chúng ta có thể chỉ bị mắc kẹt với ý nghĩa kép mãi mãi.

Phần kết luận

Tôi đánh giá cao rằng bài đăng này đã được một chút thiên vị: Tôi đã viết bài viết mà bạn liên kết đến. :) Dù sao, tôi hy vọng điều này sẽ giúp giải thích trận chiến tốt hơn một chút.

Cập nhật ngày 13 tháng 4 năm 2011

Dưới đây là ba ví dụ hoàn hảo về người đang sử dụng "STL" để chỉ toàn bộ Thư viện chuẩn C ++. Nó tiếp tục gây trở ngại cho tôi rằng rất nhiều người thề mù mà không ai từng làm điều này, khi nó đơn giản để nhìn thấy gần như hàng ngày.


136
Các S tandard T emplate L ibrary không chỉ tạo ra bởi St epanov và L ee, nhưng họ cũng đang làm việc tại S oftware T echnology L aboratory vào thời điểm đó.
Kragen Javier Sitaker 15/03/2016

21
Có ai đó hôm nay hỏi tiêu đề std::iotalà gì , bởi vì anh ta không thể làm cho nó hoạt động. Đó là một phần mở rộng không chuẩn SGI , mà họ gọi là "tiêu chuẩn" khi nó phù hợp với họ vì đó là "STL" và mọi người đều biết rằng "STL" là một phần của Thư viện chuẩn C ++, phải không? Và nó đã được giới thiệu trong C ++ 0x, nhưng không có sẵn trong C ++ 03. Grrr.
Các cuộc đua nhẹ nhàng trong quỹ đạo

40
Và MS STL được duy trì bởi S tephan T . L avavej, còn gọi là STL.
Mihaela


26
Bjarne Stroustrup phân biệt cụ thể STL với các phần khác của Thư viện chuẩn trong "canon", Ngôn ngữ lập trình C ++ phiên bản thứ 4.
codenheim

84

Không có câu trả lời nào thực sự đúng. Alexander Stepanov đã phát triển một thư viện mà ông gọi là STL (làm việc cho HP vào thời điểm đó). Thư viện đó sau đó đã được đề xuất để đưa vào tiêu chuẩn C ++.

Điều đó về cơ bản là "rẽ nhánh" phát triển. Ủy ban bao gồm một số phần, từ chối hoàn toàn những phần khác và thiết kế lại một số phần (với sự tham gia của Alexandre). Việc phát triển thư viện gốc sau đó đã được chuyển sang Đồ họa Silicon, nhưng tiếp tục tách biệt với thư viện chuẩn C ++.

Sau những mảnh đã được thêm vào thư viện chuẩn, một số bộ phận khác của thư viện tiêu chuẩn đã được sửa đổi để phù hợp hơn với những gì đã được bổ sung (ví dụ begin, end, rbeginrendđược thêm vào std::stringđể nó có thể được sử dụng như một container). Đồng thời, hầu hết các thư viện (thậm chí các phần hoàn toàn không liên quan) đã được tạo thành các mẫu để chứa các loại khác nhau (ví dụ: các luồng tiêu chuẩn).

Một số người cũng sử dụng STL chỉ là một dạng ngắn của "Thư viện tiêu chuẩn".

Điều đó có nghĩa là khi ai đó sử dụng thuật ngữ "STL", họ có thể đề cập đến bất kỳ khoảng nửa tá điều khác nhau. Dù tốt hay xấu, hầu hết những người sử dụng nó dường như bỏ qua tính đa nghĩa của ý nghĩa và cho rằng mọi người khác sẽ nhận ra những gì họ đang đề cập đến. Điều này dẫn đến nhiều hiểu lầm và ít nhất là một vài cuộc chiến nảy lửa nghiêm trọng khiến hầu hết những người tham gia trông thật ngu ngốc vì họ chỉ đơn giản nói về những điều hoàn toàn khác nhau.

Thật không may, sự nhầm lẫn có khả năng tiếp tục không suy giảm. Việc tham khảo "STL" thuận tiện hơn nhiều so với một cái gì đó như "bộ chứa, bộ lặp và thuật toán trong thư viện chuẩn C ++, nhưng không bao gồm std::string, mặc dù nó có thể hoạt động như một thùng chứa." Mặc dù "Thư viện chuẩn C ++" không dài và vụng về như vậy, "STL" vẫn ngắn hơn và đơn giản hơn nhiều. Cho đến khi hoặc trừ khi ai đó phát minh ra các thuật ngữ chính xác hơn (khi cần thiết) chỉ cần thuận tiện, "STL" sẽ tiếp tục được sử dụng và sự nhầm lẫn sẽ tiếp tục dẫn đến.


5
@Jerry: Trước đây; đó là những gì "std" là viết tắt của. :)
Các cuộc đua nhẹ nhàng trong quỹ đạo

6
@Jerry: Không chắc chắn nơi không gian tên đi vào nó. Việc triển khai tuân thủ không thêm bất cứ điều gì vào không gian tên std. Tôi đã nói về "std" trong "stdlib", viết tắt của "tiêu chuẩn". Tôi nghĩ nó khá rõ ràng điều đó có nghĩa là gì!
Các cuộc đua Lightness trong Orbit

3
@Jerry: Tôi thực sự không nghĩ rằng sẽ rất căng thẳng khi mong đợi ai đó đọc tính từ "tiêu chuẩn" vì "đây là tiêu chuẩn". Trong khi đó, 17.4.3.1/1 khá rõ ràng rằng việc thêm mọi thứ vào không gian tên stdlà UB ngoại trừ trong một số trường hợp được đặt tên cụ thể: những trường hợp bổ sung này được đặt tên trong tiêu chuẩn, và do đó vẫn tuân thủ hoàn hảo; "tiêu chuẩn" vẫn sẽ được áp dụng.
Các cuộc đua Lightness trong Orbit

1
Lịch sử của SGI và HP ở đây là ngược. Stepanov đã ở HP trước khi anh ấy ở SGI.
Kragen Javier Sitaker

2
Tôi chỉ đọc lại các bình luận ở đây và nghĩ rằng nó đáng để thêm một điểm nữa (thừa nhận là nhỏ): Tôi nghĩ rằng đó là một chút căng thẳng để mong đợi "tiêu chuẩn" luôn có nghĩa là "điều này là trong tiêu chuẩn". Đặc biệt, nhiều lập trình viên C ++ sử dụng cụm từ "thư viện chuẩn" rất lâu trước khi có được một tiêu chuẩn. Tôi nghĩ rằng họ đã đề cập đến thư viện theo tiêu chuẩn C, tôi sẽ chỉ ra rằng điều tương tự cũng đúng với các lập trình viên C trước khi có (thậm chí là một bản nháp) tiêu chuẩn C.
Jerry Coffin

52

Thuật ngữ "STL" hoặc "Thư viện mẫu tiêu chuẩn" không hiển thị ở bất kỳ đâu trong tiêu chuẩn ISO 14882 C ++. Vì vậy, coi thư viện chuẩn C ++ là STL là sai. Thuật ngữ "Thư viện chuẩn C ++" hoặc "thư viện chuẩn" là những gì được sử dụng chính thức bởi ISO 14882:

Tiêu chuẩn ISO 14882 C ++:

17 - Giới thiệu thư viện [lib.l Library]:

  1. Các mệnh đề này mô tả nội dung của Thư viện chuẩn C ++ , cách chương trình C ++ được hình thành tốt sử dụng thư viện và cách triển khai tuân thủ có thể cung cấp cho các thực thể trong thư viện.

...

STL là một thư viện được thiết kế ban đầu bởi Alexander Stepanov, độc lập với tiêu chuẩn C ++. Tuy nhiên, một số thành phần của thư viện chuẩn C ++ bao gồm các thành phần STL như vector, listvà các thuật toán như copyswap.

Nhưng tất nhiên, tiêu chuẩn C ++ bao gồm nhiều thứ hơn bên ngoài STL, vì vậy thuật ngữ "thư viện chuẩn C ++" là chính xác hơn (và là những gì thực sự được sử dụng bởi các tài liệu tiêu chuẩn).


5
+1. Mặc dù, trong STL, không có không stdgian tên (IIRC).
Các cuộc đua Lightness trong Orbit

1
Vào thời điểm đó, hầu hết các trình biên dịch C ++ không thực hiện các không gian tên. Trên thực tế, tôi không biết liệu chúng có ở trong tiêu chuẩn hay không.
Kragen Javier Sitaker 15/03/2016

3
@Kragen: Chà, không có tiêu chuẩn.
Các cuộc đua nhẹ nhàng trong quỹ đạo

3
Oh. Chà, có một vài cuốn sách của Stroustrup, nhưng tôi cho rằng đó không hoàn toàn giống như vậy, phải không?
Kragen Javier Sitaker

23

Gần đây tôi đã đưa ra lập luận tương tự, nhưng tôi tin rằng một chút khoan dung có thể được cho phép. Nếu Scott Meyers mắc lỗi tương tự, bạn đang ở trong một công ty tốt.


@Tomalak & @Mark: Thật ra Scott không, -1từ tôi. Cuốn sách thực sự là về STL với ý nghĩa là "các phần của std lib xuất phát từ thư viện của Stepanov". Hãy dành thời gian để xem qua các cuốn sách TOC. Thứ duy nhất ngoài STL ban đầu tôi có thể tìm thấy là std::string, và nó đã được trang bị để là một container STL đầy đủ.
sbi

@sbi: Rõ ràng bạn đã hiểu sai vị trí của tôi. Tôi sẽ không sử dụng "STL" theo cách mà Scott làm. Xin vui lòng đọc câu trả lời của tôi.
Các cuộc đua Lightness trong Orbit

6
@Tomalak, tôi cũng sẽ không sử dụng "STL" theo cách đó, mặc dù trước đây tôi có thể đã phạm tội. Tôi chỉ không nghĩ rằng nó đáng để đánh bại mọi người.
Đánh dấu tiền chuộc

1
Điều đó tôi có thể tôn trọng. Tôi cảm thấy lo lắng nhất về những người từ chối thừa nhận sự mơ hồ tiềm tàng ở tất cả. :)
Các cuộc đua nhẹ nhàng trong quỹ đạo

11
Bạn cũng sẽ ở trong công ty của Bjarne Stroustrup - ref. ví dụ. stroustrup.com/DnE2005.pdf : "STL (" Thư viện mẫu chuẩn "; nghĩa là khung chứa và thuật toán của thư viện chuẩn ISO C ++)"
Sander De Dycker

7

Từ Thư viện GNU C ++ (libstdc ++) FAQ :


STL (Thư viện mẫu tiêu chuẩn) là nguồn cảm hứng cho các khối lớn của Thư viện chuẩn C ++, nhưng các thuật ngữ không thể thay thế cho nhau và chúng không có nghĩa tương tự. Thư viện chuẩn C ++ bao gồm rất nhiều thứ không đến từ STL và một số trong số chúng thậm chí không có mẫu, chẳng hạn như std::localestd::thread.

Libstdc ++ - v3 kết hợp rất nhiều mã từ SGI STL (sự hợp nhất cuối cùng là từ phiên bản 3.3 ). Mã trong libstdc ++ chứa nhiều bản sửa lỗi và thay đổi so với mã SGI ban đầu.

Cụ thể, stringkhông phải từ SGI và không sử dụng lớp "dây" của họ (mặc dù nó được bao gồm như một phần mở rộng tùy chọn), cũng không phải là valarraymột số khác. Các lớp học như vector<>từ SGI, nhưng đã được sửa đổi rộng rãi.

Thông tin thêm về sự phát triển của libstdc ++ có thể được tìm thấy tại tài liệu tiến hóa API và tài liệu tương thích ngược .

Câu hỏi thường gặp cho STL của SGI vẫn được khuyến nghị đọc.


FYI, kể từ tháng 3 năm 2018, ngay cả trang web chính thức của STL www.sgi.com/tech/stl/ cũng không còn nữa .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.