2009-03-27 43 views
26

Tôi có một loạt các chuỗi mà tôi cần phải sắp xếp. Tôi nghĩ rằng một std :: vector sẽ là cách dễ nhất để làm điều này. Tuy nhiên, tôi đã không bao giờ được sử dụng vectơ trước và như vậy muốn một số trợ giúp.Làm cách nào để có thể tạo std :: vector <std::string> và sau đó sắp xếp chúng?

Tôi chỉ cần sắp xếp chúng theo thứ tự chữ và số, không có gì đặc biệt. Thật vậy, chuỗi :: so sánh chức năng sẽ làm việc.

Sau đó, làm cách nào để tôi có thể lặp lại qua chúng để xác minh rằng chúng được sắp xếp?

Dưới đây là những gì tôi có cho đến nay:

std::sort(data.begin(), data.end(), std::string::compare); 

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i) 
{ 
    printf("%s\n", i.c_str); 
} 
+0

Xin xem câu trả lời này: [boost :: sort] [1] [1]: http: // stackoverflow.com/a/14869307/1038233 – Magnetron

Trả lời

57

Bạn chỉ có thể làm

std::sort(data.begin(), data.end()); 

Và nó sẽ sắp xếp chuỗi của bạn. Sau đó đi qua chúng kiểm tra xem họ đang ở trong trật tự

if(names.empty()) 
    return true; // empty vector sorted correctly 
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
     j != names.end(); 
     ++i, ++j) 
    if(*i > *j) 
     return false; 
return true; // sort verified 

Đặc biệt, std::string::compare không thể được sử dụng như một so sánh, bởi vì nó không làm những gì sort muốn nó làm: Return true nếu đối số đầu tiên là ít hơn thứ hai, và trả về false nếu không. Nếu bạn sử dụng sort như ở trên, nó sẽ chỉ sử dụng operator<, sẽ thực hiện chính xác điều đó (ví dụ: std::string giúp trả lại first.compare(second) < 0).

+7

Chỉ để cho vui (và chưa kiểm tra): Kiểm tra xem véc tơ có được sắp xếp có thể được đơn giản hóa thành tiêu chuẩn :: aligned_find (names.begin(), names.end(), std :: lớn hơn ()) == names.end() –

+0

@ Éric Malenfant - Tôi đã thử nghiệm, nó hoạt động –

+0

@ Éric Malenfant, độc đáo được thực hiện –

3

câu hỏi là gì chính xác? Dường như tất cả mọi thứ đã có.

Tuy nhiên, có lẽ bạn nên sử dụng std::cout << *i << std::endl;

  1. i là một iterator == con trỏ đến dữ liệu trong các thùng chứa, vì vậy * là cần thiết
  2. c_str() là một chức năng của std::string và không phải là một biến

Các sự cố trong mã của bạn không liên quan đến câu hỏi của bạn?

Một số gợi ý dành cho bạn:

  • std::vector cũng đè [] điều hành, vì vậy bạn có thể tiết kiệm thay vì những rắc rối iterator và sử dụng nó như một mảng (lặp 0-vector.size()).
  • Thay vào đó, bạn có thể sử dụng std::set, thao tác này sẽ tự động sắp xếp khi chèn (cây nhị phân), vì vậy bạn sẽ lưu thêm phân loại.
  • Sử dụng một functor làm cho đầu ra của bạn thậm chí còn vui hơn: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
2

Để sử dụng loại:
std::sort hoặc std::vector< std::string>::sort(..) phương pháp.
Để kiểm tra xem nó được sắp xếp:
sử dụng std::is_sorted để kiểm tra được sắp xếp - http://www.sgi.com/tech/stl/is_sorted.html
hoặc
std::adjacent_find(v.begin(), v.end(), std::greater<std::string>()) == v.end()

đối với trường hợp của bạn, bạn có thể sử dụng so sánh mặc định

EDITED:
std::is_sorted không phải là hàm stl tiêu chuẩn, nó được định nghĩa trong thực thi sgi stl.
Cảm ơn @Brian Neal về ghi chú này.

+1

Bạn không nên dựa vào trang web sgi đó để biết thông tin về STL. Nó trước tiêu chuẩn. is_sorted không phải là tiêu chuẩn. –

+0

đã chỉnh sửa, cảm ơn bạn, vì lưu ý quan trọng này. – bayda

+1

sửa tôi nếu tôi sai: is_sorted được thêm vào trong C++ 11 http://en.cppreference.com/w/cpp/algorithm/is_sorted – abe312

2

litb là chính xác, như mọi khi.

Tôi chỉ muốn chỉ ra điểm tổng quát hơn - mọi thứ có thể được so sánh với < có thể được sắp xếp với tiêu chuẩn :: sắp xếp. Đôi khi tôi sẽ lén một hàm thành viên của toán tử < vào một cấu trúc, vì vậy tôi có thể làm điều này.

0

Bạn có thể sử dụng std::set, đây là một vùng chứa được sắp xếp một cách tự nhiên.

0

Phân loại chuỗi:

using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings 

Kiểm tra việc vector được sắp xếp:

if(vec.empty()) 
    return true; // empty vector is sorted correctly 
for(std::vector< std::string>::iterator i=vec.begin(), j=i+1; j != vec.end(); ++i, ++j) 
    if(*i > *j) return false; 
return true; // sort verified 

C++ 11 Phương pháp để kiểm tra vector sắp xếp: std::is_sorted(vec.begin(),vec.end())

Bây giờ in vector sắp xếp:

for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i) 
{ 
    std::cout<< *i <<std::endl; 
} 
+0

Tôi đã kiểm tra trên codeblocks và ideone và WORKS này chỉ tốt. – abe312

+1

Vì C++ 11, kiểm tra xem véc tơ được sắp xếp chỉ đơn giản là 'std :: is_sorted (vec.begin(), vec.end())' –

+0

Bạn không nên dựa vào trang sgi đó để biết thông tin về STL. Nó trước tiêu chuẩn. is_sorted không phải là tiêu chuẩn – abe312

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