2008-10-08 59 views
17

cố gắng tìm vị trí của giá trị nhỏ nhất trong một véc tơ, sử dụng thuật toán tìm STL (và thuật toán min_element), nhưng thay vì trả lại vị trí, nó chỉ cho tôi giá trị. Ví dụ: nếu giá trị tối thiểu là nó, vị trí sẽ được trả lại là 8 vv. Tôi đang làm gì sai ở đây?Vị trí trong Vector bằng cách sử dụng STL

int value = *min_element(v2.begin(), v2.end()); 
cout << "min value at position " << *find(v2.begin(), v2.end(), value); 
+0

Có một lỗi đánh máy trong câu hỏi của bạn: bạn nói rằng bạn muốn tìm * giá trị * lớn nhất trong một vectơ, trong khi bạn đang cố gắng tìm giá trị * tối thiểu *. –

Trả lời

34

min_element đã cung cấp cho bạn các iterator, không cần phải gọi find (thêm vào đó, nó không hiệu quả bởi vì nó gấp đôi công việc). Sử dụng distance hoặc - điều hành:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin(); 
+0

Tôi đã thử cùng với danh sách, BLEW MY OFF! TẠI SAO? – prakharsingh95

+3

@ prakharsingh95 Vì bạn đang sử dụng caps lock (và vì bạn không đọc kỹ câu trả lời của tôi - hãy thử 'std :: distance'). –

+0

Aha, xin lỗi. Khi tôi nghĩ về lý do của nó, tôi nhận ra rằng tôi sẽ phải gắn bó với toán tử '-' khi tôi giả định rằng toán tử khoảng cách hoạt động trên các danh sách liên kết và sẽ có độ phức tạp về thời gian' O (n) '. Bless C++ STL không thực hiện '-' trên danh sách liên kết, tiết kiệm rất nhiều thời gian cho mọi người. – prakharsingh95

15

Cả hai thuật toán bạn đang sử dụng lặp lại. Nếu bạn dereference một iterator, bạn sẽ có được các đối tượng đó là "nhọn" của iterator này, đó là lý do tại sao bạn in các giá trị và không phải là vị trí khi làm

cout << "min value at position " << *find(v2.begin(), v2.end(), value); 

Một iterator thể được xem như là một con trỏ (tốt, không chính xác, nhưng chúng ta hãy nói như vậy vì lợi ích của sự đơn giản); do đó, một iterator một mình không thể cung cấp cho bạn vị trí trong container. Vì bạn đang lặp lại một vector, bạn có thể sử dụng toán tử trừ khi Konrad nói:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin(); 

nhưng tôi sẽ khuyên bạn sử dụng các thuật toán std :: khoảng cách, đó là linh hoạt hơn nhiều và sẽ làm việc trên tất cả các container tiêu chuẩn:

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end())); 
+0

sử dụng khoảng cách sẽ là cách chính xác để làm điều đó. Tôi đã từng mã hóa một vấn đề bằng cách sử dụng toán tử '-', sau nhiều thay đổi kích thước giá trị trả về bằng cách sử dụng toán tử khác với vị trí thực tế. – Florian

+0

@ Florian: Bạn có thể giải thích về vấn đề mà bạn gặp phải với toán tử '? Theo như tôi biết, 'khoảng cách' là dành riêng cho các trình vòng lặp truy cập ngẫu nhiên (giống như những cái được cung cấp bởi' vectơ') để sử dụng '-', vì vậy nó làm tôi ngạc nhiên rằng chúng có thể cho kết quả khác nhau. Bạn có chắc là bạn đang sử dụng 'vectơ' không? –

7

Câu trả lời ngắn với những gì bạn nghĩ rằng bạn hỏi với "làm thế nào để xác định vị trí trong std::vector<> đưa ra một iterator từ nó ? " là hàm std::distance.

Những gì bạn có thể có nghĩa là để làm, tuy nhiên, để có được giá trị cho iterator, mà bạn có được bởi dereferencing nó:

using namespace std; 
vector<int>::const_iterator it = min_element(v2.begin(), v2.end()); 
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it; 
Các vấn đề liên quan