49572


以下のコードのコメント部ここです１，２の部分のコードの意味が知りたいです、  
itr - data.begin();は4と表示されますがそれがこの行とどう結びつくかがわかりません。  
コメントのように`//std::cout << --*itr <<
"\n";`と編集して表示させてみると4と表示されましたのですがコメント部の１のコードは何の意味なのでしょうか？  
2,for(auto x
:data)なのですがautoは型推論でfor文はわかるのですがこの形式は見たことがないので検討が付きません教えてくれますでしょうか？

[code]

    #include <iostream>
    #include <cstdlib>
    #include "conio.h"
    #include <iomanip>
    #include "math.h"
    #include <list>
    #include <sstream>
    #include "Header.h"
    #include <vector>
    #include <numeric>
    #include <algorithm>
    using namespace std;
    
    
    void view(vector<int> &v)
    {
        unsigned int i = 0;
        for (; i < v.size(); i++)
        {       
            if ((i % 10) == 0)//9以上になったら改行
            {
                cout << "\n";
            }
            cout << "[" << setw(2) << i << "] " << setw(2)<<v[i] << " ";
        }
        cout << "\n\n\n\n";
        //cout << "-----------------\n\n\n\n";
    }
    
    int main() {
    
        vector<int> data{1,2,3,4,5,6,7,8,9,10};
    
        auto itr = data.begin();
        for (;;) {
            itr = std::find(itr, data.end(), 5);   //  要素5を検索
            if (itr == data.end())   //  発見できなかった場合
                break;
            std::cout << itr - data.begin() << "\n";   //  ここです。１
            //std::cout << --*itr << "\n"; 
    
            ++itr;      //  次の位置から検索
        }
    
        reverse(data.begin(),data.end());
        for (auto x : data)//ここです。2
        {
            cout << x << " ";
        }
    
    
        //view(data);
    
    
    
    
    
    
        _getch();
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-10-23T11:34:00.757
49569
2018-10-31T08:56:17.177
2018-10-31T08:56:17.177
5008
question
c++
意味の分からないコード２つの意味が知りたい。


1 は差を取っているわけです。では何の差なのか、というと、その前に

  * コンテナとは  
複数の値を入れることができて、その要素を順番にたどることができる何か

  * イテレータとは  
上記、コンテナで要素をたどるもの `*p` のように使うと要素を取り出せる

まあ端的に、配列はコンテナの一種、配列要素へのポインタはイテレータです。 `vector` も同様コンテナで `vector::iterator`
はイテレータです (`vector.begin()` はイテレータを返却します)

イテレータは差を取ることができます。提示コードはこのイテレータの差＝どれだけ離れているかを計算しています。同じ配列の別の要素を指すポインタとポインタの差を取ると、要素がどれだけ離れているかになるのと同じですね。

でも本来このコードはダメです。イテレータの差は `std::distance` で取るべきです。  
<https://cpprefjp.github.io/reference/iterator/distance.html>  
リンク先のいう

  * 「ランダムアクセスイテレータ」は `vector` や単純配列などの場合で、このとき「差」は単純に減算一発で取れてしまいます（なので O(1) 定数時間で算出可能）
  * 「それ以外」は例えば `list` の場合で、 `list` の要素がどれだけ離れているかは１つづつ要素を追いかけていく必要があります。なので O(n) 。この理解は宿題にしときましょう。

* * *

2 は「範囲 `for` 」と呼ばれるもので  
<https://cpprefjp.github.io/lang/cpp11/range_based_for.html>  
リンク先解説にもありますが  
`begin()` から `end()` までループする処理は定番なので簡単に書けるようにしました  
というものです。


CC BY-SA 4.0
2018-10-23T12:21:35.610
49572
2018-10-23T12:21:35.610
8589
49569
answer