> 백엔드 개발 > C++ > 내 C 반복기 거리 계산이 예상치 못한 결과를 낳는 이유는 무엇입니까?

내 C 반복기 거리 계산이 예상치 못한 결과를 낳는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-31 06:31:30
원래의
1092명이 탐색했습니다.

Why Does My C   Iterator Distance Calculation Yield Unexpected Results?

반복자 사용법의 뉘앙스: C에서 거리 계산 구별

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" 지시문이 있습니다. 이 함수는 반복자를 기대하지만 코드가 벡터::iterator를 잘못 전달합니다.

문제를 해결하려면 표준 라이브러리 유형 앞에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿