2010-05-13 29 views
28

Tôi đã tự hỏi trong trường hợp nào bạn sẽ sử dụng một sợi dây thừng trên một container STL?STL Rope - khi nào và ở đâu để sử dụng

+0

Tôi chưa bao giờ nghe nói về một sợi dây thừng - nó có tiêu chuẩn không? – CiscoIPPhone

+1

Như @Neil (và những người khác) đã chỉ ra - đây không phải là một phần của tiêu chuẩn mà là một thùng chứa bổ sung là một phần của thư viện SGI. – Konrad

+0

Fancy bạn nói về nó, tôi đã chỉ nghĩ về bản thân mình về con thú tương tự trong khi tự hỏi làm thế nào Python thực hiện 'danh sách' của nó. Tôi nghĩ rằng họ sử dụng một số kỹ thuật tương tự để cho phép chèn/xóa nhanh ở giữa nó. –

Trả lời

37

Dây thừng là một khả năng mở rộng chuỗi thực hiện: chúng được thiết kế cho hoạt động hiệu quả có liên quan đến chuỗi như một toàn thể. Các hoạt động như chuyển nhượng , ghép nối và chuỗi thời gian mất gần độc lập với độ dài của chuỗi . Không giống như dây C, dây là biểu diễn hợp lý cho các chuỗi dài rất như chỉnh sửa bộ đệm hoặc thư.

Ưu:

  1. nhanh hơn nhiều nối và chuỗi các hoạt động liên quan đến dài chuỗi. Chèn một ký tự ở số giữa một dây 10 megabyte phải theo thứ tự 10s của micro giây, ngay cả khi bản sao của gốc được giữ lại, ví dụ: như một phần của lịch sử chỉnh sửa . Ngược lại, điều này sẽ theo thứ tự của một giây cho chuỗi "phẳng" thông thường đại diện. Thời gian cần thiết cho kết nối có thể được xem là không đổi đối với hầu hết các ứng dụng. Đó là hoàn toàn hợp lý để sử dụng sợi dây như trình bày tệp bên trong trình chỉnh sửa văn bản .

  2. Tiềm năng tốt hơn nhiều không gian hiệu suất. Sửa đổi nhỏ của dây đeo có thể chia sẻ bộ nhớ với bản gốc. Dây thừng được phân bổ trong nhỏ khối, giảm đáng kể bộ nhớ vấn đề phân mảnh được giới thiệu bởi khối lớn

  3. Phân chỉ đơn giản là một (có thể tham khảo tính) giao con trỏ. Không giống như các bản sao chép được tính tham chiếu, điều này vẫn còn phần lớn là đúng ngay cả khi một trong các bản sao là sau đó được sửa đổi một chút. Đó là rất rẻ để kiểm tra điểm cũ phiên bản của một chuỗi, ví dụ: trong lịch sử chỉnh sửa .

  4. Có thể xem hàm tạo ký tự làm sợi dây thừng. Do đó, một đoạn dây của có thể là một tệp 100MByte , chỉ đọc khi phần của chuỗi được kiểm tra. Ghép nối chuỗi vào cuối một tệp như vậy không liên quan đến việc đọc tệp. (Hiện tại việc triển khai của cơ sở này là chưa đầy đủ.)

http://www.sgi.com/tech/stl/Rope.html

7

Đây là giải pháp thay thế phi tiêu chuẩn cho string xử lý các kích thước dữ liệu lớn. Xem here để biết cách hoạt động.

2

tôi sẽ không sử dụng nó ở tất cả, nhưng đó là bởi vì tôi là chút của một "tính di động dễ dàng" quái vật, và chỉ có xu hướng sử dụng container bog tiêu chuẩn. Dây là một phần của việc thực hiện STL của SGI, và không phải là một phần của tiêu chuẩn C++.

+1

+1 đó là nơi tôi lần đầu tiên đọc về nó, nhưng không nhận ra nó không phải là một phần của tiêu chuẩn. – Konrad

+1

Mặt khác, có lẽ sẽ dễ dàng chỉ sao chép mã? Hoặc giấy phép SGI STL có ngăn không? –

+10

-1 STLPort (libre/free) và libstdC++ (trong gcc của GNU) đều hỗ trợ . Đây là một lớp học cần thiết cho một số nhiệm vụ, đó là những gì người hỏi hỏi. – unixman83

1

Điều xấu duy nhất với dây là chủ đề và lạm dụng.

Trong Linux (và có thể là hầu hết các hệ điều hành khác), mã chuỗi an toàn là điều làm cho dây thừng chậm hơn rất nhiều. Vì vậy, tôi chỉ trích xuất mã đó ra (thiết lập một trình biên dịch def cho chủ đề-off), bởi vì tôi đang sử dụng một chủ đề duy nhất trong một nền tảng nhúng.

Nếu không, dây dẫn nhanh hơn nhiều so với dây, ít có khả năng thoát khỏi bộ nhớ trên bộ đệm lớn và nhanh hơn nhiều cho các chỉnh sửa bộ đệm lớn; Chẳng hạn như loại bỏ một nhân vật xấu ở giữa Kinh Thánh.

Điều này là do cách thức một sợi dây được hiểu là dữ liệu. Như rất nhiều nhỏ hơn 'chuỗi' xích lại với nhau thông qua một danh sách liên kết để sản xuất chuỗi cuối cùng.

+3

"dây là nhanh hơn nhiều so với dây": không phải cho tất cả các nhiệm vụ. Lấy một ký tự trong một sợi dây bằng chỉ số của nó là nhanh hơn cho một chuỗi hơn cho một sợi dây thừng. –

+0

@Alexandre, nhưng điều này là thực hành xấu *** ngay cả đối với std :: string. Tốt hơn nhiều để sử dụng một vector của char trong trường hợp đó. – unixman83

+4

chuỗi trong C++ 0x được bảo đảm để lưu trữ các ký tự liên tục, do đó, đây không phải là thực hành xấu nữa. –

2

Có rất nhiều sự nhấn mạnh ở đây trên các chuỗi tạo thành từ các ký tự, nhưng dây chỉ đơn giản là một chuỗi 1D với chèn nhanh và xóa (bất cứ nơi nào trong chuỗi).

Có vẻ hơi ngạc nhiên khi khả năng cơ bản như vậy hiếm khi được yêu cầu cho bất kỳ thứ gì (ngoài dây). Tôi sẽ sử dụng một sợi dây số nguyên ở đâu? Tôi không biết, bởi vì thao tác nó đòi hỏi các chỉ số đến từ đâu đó.

Ví dụ thực tế tốt nhất sẽ là nơi tôi tạo giao diện người dùng để người dùng xem tập dữ liệu được tạo thành từ hàng nghìn hình ảnh và người dùng cần xóa một số ảnh và sắp xếp lại thứ tự của những người khác.

+0

Trình soạn thảo văn bản là một ví dụ thực tế không được giả tạo về tính hữu ích của cấu trúc dữ liệu dây. – JJF

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