2008-10-08 1 views
17

을 사용하는 벡터에서의 위치. 예 : 최소값 인 경우 위치가 8 등으로 반환됩니다. 여기서 내가 뭘 잘못하고 있습니까?벡터에서 STL 찾기 알고리즘 (및 min_element 알고리즘)을 사용하여 최소값의 위치를 ​​찾으려고 시도하지만, 반환 값 대신 단지 값을 제공하는 대신 STL

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

귀하의 질문에 오타가있다 : 당신이를 발견하고 싶은 말은 당신이 아마 할 무엇을 의미

은, 그러나, 당신이 그것을 역 참조에 의해 얻을 반복자에 대한 값을 얻을 수 있었다 * 벡터에서 최대 값 *, 최소 * 값을 찾으려는 경우. –

답변

34

min_element 이미 당신에게 반복자 (이 두 번 작업이기 때문에 또한, 그것은 비효율적) find를 호출 할 필요가 있습니다. distance 또는 - 연산자를 사용 : 리턴 반복자를 사용하는

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

나는 그것들을리스트와 함께 시험해 보았다. 내 머리를 벗겨라. 왜? – prakharsingh95

+3

@ prakharsingh95 대문자 잠금을 사용하고 있기 때문에 (그리고 내 대답을주의 깊게 읽지 않았기 때문에 -'std :: distance'를 시도하십시오). –

+0

아하, 죄송합니다. 그 이유에 대해 생각해 보았을 때, 거리 연산자가 연결된리스트에서 작동하고'O (n)'의 시간 복잡성을 가질 것이라고 가정 할 때'-' 연산자를 사용해야 할 것임을 깨달았습니다. 축약 된 C++ STL은 링크드리스트에'-'를 구현하지 않아 사람들에게 많은 시간을 절약합니다. – prakharsingh95

15

두 알고리즘을. 당신이 아닌 위치를 인쇄하는 이유

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

반복자를 할 때 당신이 반복자 역 참조, 당신은이 반복자에 의해 "지적"인 개체를 얻을 경우 수 포인터로 볼 수 있습니다 (글쎄, 정확하게는 아니지만, 간단히하기 위해 그렇게 말하겠습니다). 따라서 반복기만으로는 컨테이너의 위치를 ​​알 수 없습니다.

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

하지만 훨씬 더 유연하고 작동합니다 표준 : 거리 알고리즘을 사용하는 것이 좋습니다 것입니다 : 당신이 벡터를 반복하고 있기 때문에, 콘라드 말했듯이 당신은 마이너스 연산자를 사용할 수 있습니다 모든 표준 컨테이너에 :

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

거리를 사용하는 것이 올바른 방법 일 것입니다. 연산자를 사용하여 반환 값의 크기를 조정할 때 실제 위치와 다른 값을 사용한 후에 한 번 '연산자'를 사용하여 문제가 발생했습니다. – Florian

+0

@Florian : 당신이'operator-'로 가진 문제에 대해 자세히 설명해 주시겠습니까? 필자가 아는 한 '거리'는'vector'가 제공하는 것과 같은 무작위 접근 반복자에 특화되어 있기 때문에 다른 결과를 줄 수 있다는 것을 놀라게합니다. '벡터 '를 사용하고 있습니까? –

7

당신이 어떻게 내가 그것을에서 반복자 주어진 std::vector<>의 위치를 ​​결정합니까 "로 물었다 어떻게 생각하는지에 대한 짧은 대답 ? " 기능은 std::distance입니다.

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; 
관련 문제