C에서 반복자는 컨테이너 내의 요소를 탐색하고 액세스하는 강력한 수단을 제공합니다. 그러나 때로는 사용 방법이 미묘하여 예상치 못한 결과를 초래할 수도 있습니다. 다음 시나리오를 고려하십시오.
벡터에 저장된 점 사이의 거리를 계산하려고 할 때 예상 결과(0, 1.4, 1.4, 0)가 실제 결과( 0, 1, -1, 0). 이러한 불일치는 반복자 사용 문제로 인해 발생할 수 있습니다.
제공된 코드는 다음 함수를 사용하여 사용자 지정 거리 계산이 포함된 점 벡터를 사용합니다.
<code class="cpp">typedef struct point { float x; float y; } point; float distance(point *p1, point *p2) { return sqrt((p1->x - p2->x) * (p1->x - p2->x) + (p1->y - p2->y) * (p1->y - p2->y)); }</code>
기본 함수 내에서 반복자가 정의되어 벡터를 탐색하는 데 사용됩니다.
<code class="cpp">vector<point>::iterator ii; vector<point>::iterator jj; for (ii = po.begin(); ii != po.end(); ii++) { for (jj = po.begin(); jj != po.end(); jj++) { cout << distance(ii, jj) << " "; } }</code>
문제는 다음과 같은 이유로 std::distance()를 실수로 호출하는 데 있습니다. "using 네임스페이스 std" 지시문이 있습니다. 이 함수는 반복자를 기대하지만 코드가 벡터
문제를 해결하려면 표준 라이브러리 유형 앞에 std::를 붙여서 컴파일러가 적절하게 플래그를 지정하도록 하는 것이 중요합니다. 함수 매개변수가 일치하지 않습니다.
또한 대신 참조를 허용하도록 함수를 수정하는 것이 좋습니다.
<code class="cpp">float distance(const point& p1, const point& p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); }</code>
이 변경으로 인해 함수가 전달된 지점을 수정할 수 없습니다.
이전에 사용된 typedef는 최신 C에서 단순화될 수 있습니다.
<code class="cpp">struct point { float x; float y; };</code>
이는 불필요한 C와 유사한 구문을 제거하고 C 표준과 일치합니다.
위 내용은 내 C 반복기 거리 계산이 예상치 못한 결과를 낳는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!