2009-11-25 25 views
7

Tôi có một tiêu chuẩn :: tập hợp std :: string. Tôi cần "chỉ mục" hoặc "vị trí" của từng chuỗi trong tập hợp, đây có phải là khái niệm có ý nghĩa trong ngữ cảnh không?chỉ mục hoặc vị trí trong std :: set

Tôi đoán find() sẽ trả về một trình lặp cho chuỗi, vì vậy câu hỏi của tôi có thể được diễn đạt tốt hơn như sau: "Làm thế nào để chuyển đổi một trình lặp thành một số?".

+0

http://stackoverflow.com/questions/1796503/index-or-position-in-stdset/1810416#1810416 @seh nếu chúng ta thấy ngữ nghĩa, bất kỳ điều gì bạn nói đều đúng nhưng các bộ được sắp xếp. Chúng thường được thực hiện bằng cách sử dụng một số hình thức của cây cân bằng như cây đen đỏ, và sử dụng thứ tự yếu nghiêm ngặt để đặt hàng các yếu tố trong bộ này. Tôi không biết liệu các nhiệm vụ tiêu chuẩn có đặt hàng hay không. Nhưng đây là cách nó là –

Trả lời

14

std::distance là những gì bạn cần. Bạn sẽ muốn, tôi đoán std::distance(set.begin(), find_result)

+4

Ghi chú: 'std :: distance' là O (n) vì bộ lặp' set' là các mô hình 'BidirectionalIterator' và không phải' RandomAccessIterator' –

+2

std :: khoảng cách là O (N) là có bất kỳ cách để có được số liệu thống kê đơn đặt hàng trong O (log (n))? –

+1

Không có cách nào tốt.Tính toán khoảng cách có thể đạt được trong O (logN) cho bất kỳ cấu trúc nào phù hợp với việc lưu trữ sách phù hợp, nhưng nó không được yêu cầu theo tiêu chuẩn và không có thư viện STL nào mà tôi biết. Bạn cần otfind hoặc viết một cấu trúc phù hợp. – RichardPlunkett

1

Tôi không nghĩ điều đó có ý nghĩa - tập hợp được 'tự khóa' và được sắp xếp, vì vậy 'chỉ mục' sẽ bị vô hiệu khi tập hợp được sửa đổi.

Tất nhiên, điều đó phụ thuộc vào cách bạn dự định sử dụng chỉ mục và nếu tập hợp chủ yếu là tĩnh (nói một từ điển).

+0

Tôi nghĩ rằng miễn là một container được đặt hàng thì vị trí của các phần tử của nó có ý nghĩa ngữ nghĩa. Đặc biệt, vị trí thực tế có thể quan trọng, tùy thuộc vào những gì bạn đang làm (ví dụ như dữ liệu dấu thời gian). Nếu tập hợp thay đổi, thì tự nhiên vị trí của một số yếu tố cũng vậy. – laura

1

Mặc dù những gì người khác đã viết ở đây, tôi không nghĩ rằng "chỉ mục" hoặc "vị trí" có ý nghĩa đối với một tập hợp. Trong thuật ngữ toán học, một tập hợp chỉ cho thấy các thành viên của nó và có thể là bản số của nó. Các hoạt động có ý nghĩa duy nhất liên quan đến việc kiểm tra xem một mục có phải là một thành viên của tập hợp hay không, và kết hợp hoặc trừ các bộ để tạo ra các bộ mới.

Một số người nói về bộ làm cấu trúc dữ liệu theo các thuật ngữ lỏng lẻo hơn, theo khía cạnh "được sắp xếp" hoặc "không có thứ tự" và liệu chúng có cho phép trùng lặp hay không. Mặt trước phân biệt một mảng với một bảo vệ chèn O (n), nơi một nỗ lực chèn mục trước tiên quét các thành viên hiện có để xem mục mới có tồn tại hay không, và chèn mục mới vào cuối và bảng băm, rằng có thể chỉ giữ lại thứ tự như vậy trong chuỗi của một nhóm. Một cây như cây đỏ-đen được sử dụng bởi std::set là một nơi nào đó ở giữa; thứ tự truyền tải của nó là xác định đối với strict weak order được áp đặt bởi biến vị ngữ so sánh, nhưng, không giống như mảng được phác thảo ở trên, nó không giữ lại thứ tự chèn .

Khía cạnh khác - cho dù bộ cho phép các phần tử trùng lặp - là vô nghĩa trong toán học và được mô tả chính xác hơn là một túi . Cấu trúc như vậy thừa nhận sự khác biệt giữa nhận dạng và giá trị "dựa trên giá trị".

Sự cố của bạn có thể liên quan đến việc chăm sóc một số vị trí; nó không rõ ràng vị trí đó có nghĩa là gì, nhưng tôi hy vọng bạn sẽ cần một số cấu trúc dữ liệu riêng biệt từ std::set để mô hình này đúng cách. Có lẽ một ánh xạ std::map từ tập hợp các phần tử của bạn đến từng vị trí sẽ thực hiện. Điều đó sẽ không đảm bảo rằng các vị trí là duy nhất.

Điều này cũng có thể giúp làm rõ vấn đề suy nghĩ cách bạn mô hình hóa mối quan hệ , chẳng hạn như trong cơ sở dữ liệu quan hệ. Điều gì bao gồm chìa khóa? Những phần nào của các thực thể có thể khác nhau một cách độc lập?

+0

Tôi đang xây dựng một "bộ" các chuỗi duy nhất từ ​​cơ sở dữ liệu, sau đó các chuỗi đó phải được biểu diễn dưới dạng số. Hàm distance() đủ. Có thể (có thể xảy ra?) Tập hợp đó không phải là một lựa chọn tốt, tôi đã làm nó bởi vì nó dường như là một cách hiệu quả để đảm bảo tính duy nhất của các chuỗi. STL là lãnh thổ mới cho tôi. –

+0

Nếu bạn đã tìm thấy một thiết kế giải quyết vấn đề của bạn, tất cả đều tốt. Nếu bạn thấy mình nóng lên với các khái niệm STL, bạn có thể thưởng thức cuốn sách * Các yếu tố lập trình * của Stepanov và McJones (http://www.elementsofprogramming.com/). – seh

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