2012-10-10 41 views
10

C++ Phân loại Mảng LớpC++ Phân loại Lớp Mảng

tôi có một đối tượng mảng ghi lại sau ..

Đây là tại classone.h

ClassOne 
{ 
string name; 
int data; 
float valueData; 
} 

và các nhà xây dựng được tạo ra tại classone.cpp

Tại main.cpp Tôi đã tạo ClassOne Array of Size 10

#include "classone.h" 

ClassOne cone[10]; 

Tiếp theo là tôi ghi nhận nhiều giá trị cho các đối tượng

và bây giờ ClassOne có 3 đối tượng

cone[0] 
name = "hello" 
data = 1 
valueData = 20 

cone[1] 
name = "panda" 
data = 2 
valueData = 15 

cone[2] 
name = "joe" 
data = 3 
valueData = 25 

gì tôi muốn đạt được là làm một loại có thể sắp xếp lại mảng này bằng cách valueData hình thức tăng dần cao nhất như vậy .. nó sẽ là

cone[2] sau đó cone[0] sau đó cone[1] ..

nhưng vấn đề nếu tôi sử dụng bong bóng sắp xếp, tôi đã cố gắng google và tìm thấy một số người, họ được sắp xếp theo ví dụ int a[]={9,6,5,23,2,6,2,7,1,8};

nhưng tôi muốn sắp xếp theo đối tượng mảng lớp. và sắp xếp lại giá trị với nhau, làm cách nào để tôi đạt được điều này.

Vì vậy, khi tôi cout nó sẽ được

-- Highest to lowest -- 
1) Name: Joe , Data = 3, Value =25 
2) Name: Hello , Data =1 , Value = 20 
3) Name: Panda, Data = 2, Value = 15 

Cảm ơn tất cả sự giúp đỡ và hướng dẫn !!

+0

rất nhiều phiếu xuống trên câu hỏi của tôi .. i am mới để C++. và không thực sự biết cách tiếp tục. –

Trả lời

2

Bạn phải xác định toán tử so sánh cho lớp của mình. Cách bạn xác định xem một đối tượng có nhỏ hơn một đối tượng khác không rõ ràng từ câu hỏi của bạn hay không.

17

Cách đơn giản nhất là sử dụng các thư viện chuẩn:

#include <algorithm> 

std::sort(cone, cone + 10, 
      [](ClassOne const & a, ClassOne const & b) -> bool 
      { return a.value < b.value; }); 

Nếu bạn sẵn sàng để xác định một toán tử so sánh trên toàn cầu, bạn thậm chí không cần lambda:

bool operator<(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10); 

Hoặc bạn có thể làm cho bộ so sánh thành một hàm thành viên. Hoặc bạn có thể cho hàm so sánh tên tùy chỉnh và chuyển nó làm đối số thứ ba của sort. Đây có thể là một ý tưởng tốt trong trường hợp so sánh là cụ thể cho tình hình của bạn và không phải là "tự nhiên":

bool ValueCmp(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10, ValueCmp); 

Phiên bản cuối cùng là hữu ích nếu bạn không có C++ 11 hỗ trợ (đối với lambdas, như trong trường hợp đầu tiên), hoặc nếu bạn muốn sử dụng lại bộ so sánh trong nhiều tình huống khác nhau.

+2

+1, lưu ý cho người đọc - chỉ sử dụng lambdas là C++ 11. –

+0

Tôi không chắc chắn làm thế nào để áp dụng sắp xếp cho đối tượng của tôi .. tôi đã thử ví dụ của bạn nhưng có một số lỗi .. –

+0

@baokychen: Tôi đã viết sai chính tả tên lớp. Làm mới trang và thử lại. Nó sẽ hoạt động. –

6

Sử dụng std::sort và một chức năng sắp xếp phù hợp/functor:

bool comp(const ClassOne& lhs, const ClassOne& rhs) 
{ 
    return lhs.valueData < rhs.valueData; 
} 

std::sort(cone, cone+10, comp); 

hoặc, trong C++ 11,

std::sort(std::begin(cone), std::end(cone), comp); 
+0

Tôi thấy hướng dẫn của bạn về thư viện chuẩn, làm thế nào để tôi sử dụng nó với đối tượng hình nón của tôi? –

+0

@baokychen giống như trên. Bạn không có một đối tượng hình nón, bạn có một mảng các đối tượng 'ClassOne' được gọi là' cone ??. – juanchopanza

+0

Để nhất quán và rõ ràng, tôi đề nghị sử dụng toán tử địa chỉ '&' để tạo các con trỏ hàm, thay vì chuyển đổi ngầm từ hàm sang con trỏ hàm. –

3

Nhìn vào nguồn loại Bubble của bạn. Tại một thời điểm nào đó, nó sẽ so sánh một số int với một số khác, có thể với toán tử nhỏ hơn (<) hoặc lớn hơn toán tử (>). Đó là nơi hàm sắp xếp xác định thứ tự tương đối của hai mục đó. Bằng cách lặp lại so sánh đó nhiều lần, hàm sắp xếp có thể xác định tổng số thứ tự của bộ sưu tập.

Bạn cần thay thế thao tác đó bằng chức năng so sánh của riêng bạn. Một hàm nhận hai đối tượng trong lớp của bạn và trả về true nếu giá trị đầu tiên được xem là nhỏ hơn số thứ hai, sai nếu giá trị thứ hai được xem là nhỏ hơn giá trị thứ nhất và false nếu chúng được coi là tương đương.

5

Bạn có thể tạo cấu trúc thực hiện phương pháp operator < rằng std::sort trong tiêu đề <algorithm> sử dụng để sắp xếp các mục được lặp lại.

struct One { 
string name; 
int data; 
float valueData; 

bool operator < (const one &a) const{ 
return valueData <a.valueData; 
} 

}; 

sau đó tất cả các bạn phải làm là để thực hiện một loạt các cấu trúc này và sắp xếp nó bằng cách sử dụng chức năng sắp xếp

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