2010-09-20 33 views
5

Tôi có một cấu trúcMột cấu trúc dữ liệu hiệu quả để giữ biến cấu trúc với sắp xếp khả năng

struct dbdetails 
{ 
    int id; 
    string val; 
}; 

Tôi cần một cấu trúc dữ liệu trong C++ có thể chứa biến cấu trúc với một khả năng phân loại. Có thể không? Tôi đã nhìn vào vector, mà có thể giữ biến cấu trúc, nhưng tôi sẽ không thể sắp xếp nó dựa trên id, bởi vì nó là một thành viên cấu trúc. Bất kỳ đề xuất?

+6

'try' là từ khóa được đặt trước trong C++. Bạn có chắc chắn 'struct' này được gọi là" thử không? " –

+0

Không, tôi chỉ đang cố trích dẫn một ví dụ. Im không sử dụng thử. Nó được đặt tên dbdetails trong chương trình của tôi. – sethu

+0

Ồ, được rồi. Tôi đã chỉnh sửa câu hỏi để bao gồm tên đó, để nó không gây ra lỗi biên dịch. –

Trả lời

6

Bạn cần một functor tùy chỉnh để so sánh các cố gắng của bạn. Điều này nên thực hiện thủ thuật:

#include <algorithm> 
#include <vector> 
// try is a keyword. renamed 
struct sorthelper : public std::binary_function<try_, try_, bool> 
{ 
    inline bool operator()(const try_& left, const try_& right) 
    { return left.id < right.id; } 
}; 

... 
std::vector<try_> v; 
// fill vector 
std::sort(v.begin(), v.end(), sorthelper()); 
... 

Vui lòng hỏi nếu bạn có bất kỳ câu hỏi tiếp theo nào. Bạn có cuốn sách Stroustrup?

Edit: Đề xuất của Matteo:

struct try_ 
{ 
    int id; 
    string val; 
    bool operator<(const try_& other) const 
     {return id < other.id;} 

}; // no s here plz. 

... 
std::vector<try_> v; 
// fill vector 
std::sort(v.begin(), v.end()); 
... 
+2

Một giải pháp thay thế có thể là xác định toán tử ít hơn là thành viên của cấu trúc và tránh viết các trình so sánh tùy chỉnh. –

0

Bạn có thể sắp xếp một vectơ dựa trên cấu trúc thành viên. Bạn chỉ cần một bộ so sánh tùy chỉnh.

1

Bạn có thể có một vector của struct 's và sau đó sắp xếp chúng như:

std::sort(vectStruct.begin(), vectStruct.end(), &vectStructSort); 

bool vectStructSort(Try const& lhs, Try const& rhs) { // try is keyword. 
    return lhs.id < rhs.id; 
} 
+0

Tôi thực sự không nắm bắt được việc sử dụng thử đã dành riêng. Đã chỉnh sửa bài đăng này trong bài đăng của tôi. –

1

Nó phụ thuộc bởi những gì yêu cầu bạn có về nơi chứa dữ liệu của bạn. Bạn có thể tìm thấy một tập hợp hữu ích (trong Stl, Set là một Container liên kết được sắp xếp để lưu trữ các đối tượng của kiểu Key). Hoặc thậm chí một tập hợp Hash, hoặc một mảng được sắp xếp.

Nếu bạn biết rằng bạn cần sắp xếp các yếu tố của mình, tốt hơn là nên sử dụng vùng chứa đã sắp xếp, thay vì sắp xếp nó mỗi lần bạn cần.

+0

Hash set/map không có thứ tự, AFAIK. Chúng cung cấp tra cứu nhanh, nhưng chúng không có thứ tự - và không thể được sắp xếp. –

4

Bạn có thể sử dụng std::map. Họ đều được sắp xếp theo mã, vì vậy bạn có thể làm:

std::map<int, std::string> myStuff; 

Đây là một bản đồ với một int như chìa khóa và std::string như giá trị. Khi bạn lặp lại bản đồ, bạn sẽ thấy rằng nó được sắp xếp tự động theo khóa.

Lưu ý rằng bạn sẽ không còn cần struct với giải pháp này nữa. Nếu bạn hoàn toàn cần dữ liệu trong một struct (có lẽ để giao tiếp với một số thư viện bên ngoài), bạn luôn có thể sao chép dữ liệu từ map thành một struct nếu cần.

1

Tất cả các thùng chứa đã đặt hàng (std::set, std::map, std::multiset, std::multimap) đều được đặt hàng. Các thùng chứa không có thứ tự (std::list, std::vector, std::deque) có thể được đặt hàng bằng cách cung cấp chức năng so sánh sử dụng std::sort (vector, deque) hoặc bằng cách cung cấp bộ so sánh đó cho phương pháp thành viên (danh sách).

Tất cả đều tóm tắt những gì bạn thực sự cần. Nếu bạn cần phải giữ cho các yếu tố được sắp xếp mọi lúc, thì hộp chứa được sắp xếp có thể hiệu quả hơn việc sửa đổi vùng chứa và sử dụng. Mặt khác, nếu có container được sắp xếp ở tất cả các lần không phải là một yêu cầu, nhưng có thể sửa đổi các yếu tố sau đó bạn có thể thích một vector. Các thùng chứa được sắp xếp duy trì các khóa như các đối tượng không đổi, vì việc sửa đổi các khóa sẽ phá vỡ sự bất biến sắp xếp.

Trong một số trường hợp, vùng chứa cần được sắp xếp mọi lúc, nhưng không thay đổi sau một số giai đoạn khởi tạo.Trong trường hợp đó một container không được sắp xếp được sắp xếp sau khi khởi tạo có thể được sử dụng tốt.

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