2012-03-13 25 views
6

Nếu tôi có một std::vector<int>, tôi có thể có được chỉ số của phần tử tối thiểu bằng cách trừ đi hai vòng lặp:Index của nguyên tố tối thiểu trong một std :: danh sách

int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin(); 

Tuy nhiên, với container mà không có ngẫu nhiên truy cập vòng lặp, ví dụ: std::list<int>, điều này không hoạt động. Chắc chắn, bạn có thể làm điều gì đó như

int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end())); 

nhưng sau đó tôi phải lặp lại hai lần thông qua danh sách.

Tôi có thể lấy chỉ mục của phần tử với giá trị tối thiểu bằng thuật toán STL bằng cách chỉ lặp lại một lần thông qua danh sách hoặc tôi có phải mã cho vòng lặp của riêng mình không?

+15

Tại sao bạn cần chỉ số của một phần tử trong một 'std :: list'? –

+0

Bạn có thể viết một trình lặp kết thúc tốt đẹp 'list :: iterator' và theo dõi chỉ mục của nó khi nó đi. Nó sẽ bị hạn chế sử dụng, vì việc chèn/loại bỏ các phần tử từ thùng chứa sẽ làm mất hiệu lực các chỉ mục được lưu trữ trong các trình vòng lặp của bạn, nhưng bạn có thể sử dụng 'min_element' và các thuật toán khác trên nó, sau đó lấy chỉ mục ra khỏi giá trị trả về. –

+2

Bạn có thể sử dụng 'std :: set' hoặc sắp xếp vùng chứa của bạn và luôn biết vị trí yếu tố tối thiểu là ... – AJG85

Trả lời

1

Bạn sẽ phải viết chức năng riêng của bạn, ví dụ:

template <class ForwardIterator> 
    std::size_t min_element_index (ForwardIterator first, ForwardIterator last) 
{ 
    ForwardIterator lowest = first; 
    std::size_t index = 0; 
    std::size_t i = 0; 
    if (first==last) return index; 
    while (++first!=last) { 
    ++i; 
    if (*first<*lowest) { 
     lowest=first; 
     index = i; 
    } 
    } 
    return index; 
} 
Các vấn đề liên quan