2014-04-11 15 views
5

Ví dụ tôi đã thiết lập các giá trị trong std::set:Cách tìm giá trị đầu tiên nhỏ hơn khóa tìm kiếm bằng bộ STL?

{1, 2, 3, 5, 6} 

Và một phím tìm kiếm, để cho nó được 4, tôi muốn tìm ra val đầu tiên. ít hơn khóa tìm kiếm, 3 trong trường hợp này, làm thế nào để làm điều đó?

Trong Java có chức năng đang greater(), lower() trong TreeSet

+0

Nó phải có giá trị lớn nhất nhỏ hơn khóa tìm kiếm. – GoldRoger

+1

Đã có một chức năng templated hoạt động với cả 'std :: map' và' std :: set'. http://stackoverflow.com/a/529916/817441 – Ixanezis

Trả lời

1

Bạn có thể sử dụng lower_bound và sau đó đi một trở lại ví dụ:

auto it = set.lower_bound(4); 
if(it != set.begin()) 
{ 
    --it; 
} 
else 
{ 
    //Add error handling 
} 
+0

Điều này sẽ dẫn đến ngoại lệ nếu 'lower_bound' trả về phần tử đầu tiên – Ixanezis

+0

@Ixanezis: Có, đã chỉnh sửa. – Naveen

+2

@Naveen 'set' là tên khủng khiếp cho một biến trong' C++'. Tôi thích sử dụng 'auto'. Bạn có thể xem xét thêm một bình luận đây là giải pháp C++ 11. –

12

Đơn giản chỉ cần tìm ra lower_bound cho khóa đó và sau đó giảm nó một lần.

set<int> a; 
set<int>::iterator it = a.lower_bound(5); 
if (it != a.begin()) { 
    it--; 
    cout << *it << endl; 
} else { 
    cout << "No smaller element found!" << endl; 
} 

Bạn có thể tìm thấy ví dụ hoàn chỉnh here.

+1

Đó là một chút dư thừa để nói "giảm dần một". Đặt trình vòng lặp không phải là truy cập ngẫu nhiên, bạn không thể giảm chúng bằng 2. ('- = 2' thậm chí không biên dịch). – MSalters

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