2011-10-15 8 views
5

Tôi có một bộ dữ liệu trong một số trường hợp, tôi cần sắp xếp chúng theo một cách và một số dịp theo cách khác. Ví dụ: giả sử tập dữ liệu là tập hợp các chuỗi, {"abc", "dfg", ...}. Đôi khi tôi cần phải sắp xếp chúng theo thứ tự chữ cái và đôi khi bằng cách so sánh chiều dài của chúng. Ban đầu tôi đã sử dụng tiêu chuẩn :: được đặt làm vùng chứa dữ liệu của tôi và triển khai 2 bộ so sánh, hy vọng rằng tôi có thể thay đổi bộ so sánh của bộ khi đang di chuyển, khiến dữ liệu rất lớn và không sao chép nó từ một bộ khác .. Tôi chỉ muốn sắp xếp nó bằng cách sử dụng các bộ so sánh khác nhau theo thời gian. Điều này có thể hay là cách thích hợp để làm điều đó?Có thể thay đổi bộ so sánh của C++ std :: set?

Trả lời

6

Bạn phải chỉ định bộ so sánh của std::set khi xây dựng.

Là giải pháp, tôi sẽ duy trì hai bộ 'chỉ mục' thay thế, mỗi bộ tham chiếu đến bộ sưu tập thực tế. Điều này sẽ mang lại sự linh hoạt lớn nhất. Để giữ cho mọi thứ cùng nhau, tôi đề nghị bạn quấn nó lên trong một lớp học duy nhất:

// to be compiled, debugged etc..., but ideal 
// to grab the idea 
// caveats: maintain the index objects whenever the collection 
// gets resized/reallocated etc... 
// so not to be written yourself, use an existing library :) 
template< typename T, typename comp1, typename comp2 > 
struct MultiIndex { 
    std::deque<T> collection; 
    std::set<T*, comp1> index1; 
    std::set<T*, comp2> index2; 

    void insert(const T& t){ 
     collection.push_back(t); 
     index1.insert(&collection.back()); 
     index2.insert(&collection.back()); 
    } 
}; 

thư viện Boost có một lớp như: Multiindex.

+0

Cảm ơn xtofl! Chính xác những gì tôi muốn. – blurrcat

2

Bộ được giữ trong nội bộ luôn được sắp xếp (nếu không bạn sẽ không có hiệu suất cần thiết), vì vậy không, không thể thay đổi bộ so sánh. Những gì tôi nghĩ rằng giải pháp tốt nhất ở đây là để duy trì hai bộ với cùng một dữ liệu, nhưng với các bộ so sánh khác nhau. Tôi sẽ đóng gói hai bộ trong một lớp và có các chức năng như chèn làm việc trên cả hai bộ để đảm bảo dữ liệu giống nhau trên cả hai bộ.

Nếu bạn chỉ không cần phải sắp xếp dữ liệu mọi lúc, một cách khác để thực hiện những gì bạn muốn chỉ đơn giản là sử dụng ví dụ: một véc tơ và sắp xếp theo bất kỳ bộ so sánh nào bạn cần khi cần thiết.

1

Không, không phải khi đang di chuyển. Cây được xây dựng dựa trên các tiêu chí sắp xếp được chỉ định tại thời điểm xây dựng. Bạn đang nói về việc xây dựng nhiều chỉ mục thành một tập dữ liệu duy nhất, có thể được thực hiện với nhiều tập hợp. Có lẽ rất nhiều libs như tăng mà có một cái gì đó đã tạo ra cho việc này.