質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

vector イテレータ同士の減算が分からない

TANAKA
TANAKA

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2回答

0グッド

0クリップ

284閲覧

投稿2022/10/22 14:23

町が N 個ある。町 i から町 Ai に移動することを K 回繰り返す。
町 1 から始めた時、最終的にどの町にたどり着くか?

という問題の解答コードで

int s = find(path.begin(), path.end(), now) - path.begin();
int r = (int)path.size() - s;

この2文の -  の記号はどういう役割をしているのか知りたいです。
またイテレータというのも完全に理解していないため、少し詳しく説明してくれるとありがたいです。
解説をどうかお願いします。

全体↓

c++

1#include <iostream> 2#include <set> 3#include <vector> 4using namespace std; 5 6using ll = long long; 7 8int main() { 9 ll N, K; 10 cin >> N >> K; 11 vector<int> A(N); 12 for (int i = 0; i < N; i++) { 13 cin >> A.at(i); 14 A[i]--; // 0-indexed に変更 15 } 16 17 set<int> used; // 探索済みの町を保存 18 vector<int> path; // 探索の順番を格納 19 int now = 0; 20 while (used.count(now) == 0) { // 探索済みの町に到達するまで 21 path.push_back(now); 22 used.insert(now); 23 now = A[now]; 24 } 25 int s = find(path.begin(), path.end(), now) - path.begin(); // s: ループする最初の部分に到達するまで 26 int r = (int)path.size() - s; // 周期 27 28 if (K < s) { // ループ部分に到達しない時 29 cout << path[K] + 1 << endl; 30 return 0; 31 } 32 else { // ループ部分に到達する時 33 cout << path[(K - s) % r + s] + 1 << endl; 34 return 0; 35 } 36}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

ベストアンサー

イテレータの基本的な役割はコンテナ (今は範囲 (range) という概念もあります) の要素を指し示すもの、辿るものです。 コンテナの性質によって出来ることが異なり、たとえば vector なら一足飛びで十番目の要素にアクセスできますがリストだとノードを十回辿ることによってたどり着けます。

イテレータもまた辿る対象の性質に合わせて種類を分けなければならず、 vectorbegin が返すイテレータはランダムアクセスイテレータと呼ばれる種類に該当します。

そしてそのランダムアクセスイテレータの性質の中には引き算が可能であることという定めがあります。 例えばイテレータ a b があったときに b-a が可能であること、 n=b-a としたときに a+n==b であり、また ++an 回繰り返すこと (n が負数である場合は --a-n 回繰り返すこと) でも b に等しくなることといった性質も定められています。 つまり要素間の距離を計算するために引き算が使えるということです。

ランダムアクセスイテレータの性質はポインタによく似ており、実際に配列に対するポインタはランダムアクセスイテレータの性質を満たします。

投稿2022/10/23 02:23

SaitoAtsushi

総合スコア4927

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

TANAKA

2022/10/23 10:26

回答ありがとうございます。

0

この2文の -  の記号はどういう役割をしているのか知りたいです。

質問のタイトルに書いているとおり、イテレータ同士の引き算です。vectorの返すイテレータは、「ランダムアクセスイテレータ」といって、ポインタと同様に距離の計算が可能です。

投稿2022/10/22 14:50

maisumakun

総合スコア141388

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。