問題ステートメント:
ベクトルに格納された点間の距離を計算する場合、イテレータの不適切な使用が原因である可能性があります。
コード スニペット:
<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)); } int main() { vector<point> po; point p1; p1.x = 0; p1.y = 0; point p2; p2.x = 1; p2.y = 1; po.push_back(p1); po.push_back(p2); 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) << " "; } } return 0; }</code>
不正な出力:
0 1 -1 0
解決策:
この問題は、反復子で動作する std:: distance() 関数を無意識のうちに呼び出すことで発生します。これを解決するには、標準ライブラリ型の先頭に std:: を付け、代わりに参照を取得するように distance() 関数を変更します。
<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>
次に、逆参照イテレータを使用して関数を呼び出します。
<code class="cpp">distance(*ii, *jj);</code>
追加の最適化:
typedef で構造体として定義する必要がなくなったため、typedef の代わりに C で構造体ポイントを直接使用します。
以上がC ベクトル内の点間の距離を計算するときに不正確な距離が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。