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

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

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

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

Q&A

解決済

2回答

1242閲覧

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

TANAKA

総合スコア3

C++

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

0グッド

0クリップ

投稿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}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TANAKA

2022/10/23 10:26

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

0

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

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

投稿2022/10/22 14:50

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問