イテレータを使うには?
質問
私は2点間の距離を計算しようとしています。私はC + +でベクトルに格納されている2つの点:(0,0)と(1,1)。
私は次のような結果を得ることになっています。
0
1.4
1.4
0
しかし、実際に得られた結果は
0
1
-1
0
vectorでのiteratorの使い方がおかしいと思います。 どうしたらこの問題を解決できますか?
下にコードを載せました。
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;
}
どのように解決するのですか?
あなたのコードが全くコンパイルされないのは、おそらくあなたが
using namespace std
がどこかにあるからでしょう。(そうでなければ
vector
にしなければならないでしょう。
std::vector
.)
それは私が忠告したいことです
そして、あなたはその良い事例を提供してくれました。
偶然にも、あなたの電話がかかってきました。
std::distance()
これは2つのイテレータを取り、それらの間の距離を計算します。usingディレクティブを削除し、すべての標準ライブラリ型のプレフィクスとして
std::
を渡そうとすると、コンパイラはそのことを教えてくれます。
vector <point>::iterator
を渡そうとしたと
point*
が必要でした。
イテレータが指すオブジェクトへのポインタを得るには、オブジェクトへの参照を与えるイテレータの参照を解除し、その結果のアドレスを取得する必要があります。
&*ii
.
(なお、ポインタは
std::vector
イテレータのすべての要件を完全に満たすものであり、標準ライブラリの初期の実装では実際にそのためにポインタが使用されており、これにより
std::vector
イテレータをポインタとして扱うことができました。しかし、最近の実装では、そのために特別なイテレータクラスを使用しています。クラスを使うことで、ポインタやイテレータの関数をオーバーロードすることができるからだろう。また、ポインタを
std::vector
イテレータとして使用すると、ポインタとイテレータの混在が助長され、コンテナを変更したときにコードがコンパイルできなくなります(笑)。
しかし、このようなことをするよりも、代わりに参照を受け取るように関数を変更することをお勧めします ( この回答 をご覧ください)。:
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));
}
なお、ポイントは
const
の参照で取られていることに注意してください。これは呼び出し側に対して、この関数が渡されたポイントを変更しないことを示す。
では、このように呼び出すことができます。
distance(*ii,*jj)
.
余談ですが、この
typedef struct point {
float x;
float y;
} point;
はC++では不要なC言語イズムです。ただ、スペル
struct point {
float x;
float y;
};
というのは、もしこの
struct
の定義が C コンパイラでパースされた場合、問題が生じます(コードは
struct point
を参照しなければなりませんが、単に
point
を意味する) が、おそらく
std::vector
などは、C コンパイラにとってはるかに困難なものでしょう。
関連
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] 基本的なイテレータを作るには?
-
[解決済み] C++コンテナにおけるイテレータの無効化ルール
-
[解決済み] IteratorをStreamに変換するには?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み】C++で関数にオブジェクトを渡すには?