2013-08-15 38 views
8

Có một thực hiện trong thư viện đệm giao thức cho phép sắp xếp các mảng đó là quy định như trường lặp lại? Ví dụ: giả sử mảng bao gồm các mục của loại mà chính nó chứa trường chỉ mục dựa trên các mục mảng cần phải được sắp xếp. Tôi không thể tìm thấy nó, vì vậy tôi đoán là tôi sẽ tự viết một bản. Chỉ muốn xác nhận. Cảm ơn.Phân loại các mục trong trường lặp lại của một thông điệp trong Google Nghị định thư Buffers

+2

Đó chỉ là ... * không phải là công việc của protobuf *; nếu bạn muốn dữ liệu được sắp xếp, sắp xếp nó * trước * bạn nhận được gần serializer. Công việc của serializer là lấy dữ liệu về byte và ngược lại, bảo toàn ngữ nghĩa như thứ tự. –

+0

@MarcGravell, thực sự tôi đã hy vọng tôi sẽ không phải thực hiện một bản sao của cùng một dữ liệu trong mã ứng dụng của tôi và sau đó giảm tải nó vào protobuf, nhưng để có thêm thông tin được sắp xếp tôi đoán tôi sẽ phải làm vậy. Cảm ơn. – AarCee

Trả lời

8

Protobufs cung cấp một giao diện RepeatedPtr, qua mutable_ * phương pháp, có thể được sắp xếp với std :: sort() mẫu.

Trừ khi loại cơ bản của trường lặp lại là trường đơn giản, bạn có thể muốn sử dụng toán tử quá tải <, bộ so sánh hoặc lambda để làm như vậy. Ví dụ về đồ chơi sử dụng lambda sẽ là:

message StaffMember { 
    optional string name = 1; 
    optional double hourly_rate = 2; 
} 

message StoreData { 
    repeated StaffMember staff = 1; 
} 

StoreData store; 
// Reorder the list of staff by pay scale 
std::sort(store->mutable_staff()->begin(), 
      store->mutable_staff()->end(), 
      [](const StaffMember& a, const StaffMember& b){ 
      return a.hourly_rate() < b.hourly_rate(); 
      });