2012-05-19 37 views
7

Tôi muốn tìm chỉ số của giá trị nhỏ nhất trong C++ std::vector<double>. Dưới đây là một việc thực hiện phần nào tiết về điều này:ArgMin cho vector <double> trong C++?

//find index of smallest value in the vector 
int argMin(std::vector<double> vec) 
{ 
    std::vector<double>::iterator mins = std::min_element(vec.begin(), vec.end()); //returns all mins 
    double min = mins[0]; //select the zeroth min if multiple mins exist 
    for(int i=0; i < vec.size(); i++) 
    { 
     //Note: could use fabs((min - vec[i]) < 0.01) if worried about floating-point precision 
     if(vec[i] == min)  
      return i; 
    } 
    return -1; 
} 

(. Hãy cho tôi biết nếu bạn nhận thấy bất kỳ sai lầm trong việc thực hiện trên, chúng tôi đã thử nghiệm nó, nhưng thử nghiệm của tôi là không phải ở tất cả đầy đủ.)

Tôi nghĩ rằng việc thực hiện trên có thể là sự tái tạo bánh xe; Tôi muốn sử dụng mã tích hợp nếu có thể. Có một cuộc gọi một dòng đến một chức năng STL cho điều này? Hoặc, ai đó có thể đề xuất triển khai ngắn gọn hơn không?

+3

'std :: min_element' không" trả về tất cả phút ". Nó trả về một iterator cho phần tử nhỏ nhất trong phạm vi. Nếu giá trị tối thiểu xảy ra nhiều lần thì trình vòng lặp sẽ trỏ đến điểm đầu tiên. 'Phút [0]' của bạn có thể là '* phút' vì nó là một trình lặp, không phải là một mảng kết quả. – Blastfurnace

Trả lời

15

Bạn có thể sử dụng các tiêu chuẩn min_element chức năng:

std::min_element(vec.begin(), vec.end()); 

Nó trả về một iterator tới phần tử tối thiểu trong phạm vi iterator. Vì bạn muốn có chỉ mục và bạn đang làm việc với vector s, bạn có thể trừ toán tử kết quả từ vec.begin() để nhận chỉ mục đó.

Có quá tải bổ sung cho hàm hoặc đối tượng hàm nếu bạn cần so sánh tùy chỉnh.

+1

... sau đó trừ các vòng lặp để tìm ra chỉ mục. –

+3

'std :: min_element (v.begin(), v.end()) - v.begin()' –

+15

@larsmans: Làm thế nào thô. Những người tinh vi nói 'std :: distance (v.begin(), std :: min_element (v.begin(), v.end()))' :-) –

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