C++:iteratorがよくわからない数値を出すメモ

競プロをやっていて、これでつまづいた。まじでうざい。
アルゴリズム自体はあっていても言語の仕様でつまづいて本当にうざかった。
原因はよくわかってないけど指定の仕方がよくなかったと思う。
ちゃんとbegin()とend()で数値を指定しないといけないのかも?
二次元配列でやったのも問題だったのかも。

    int N;
    cin >> N;
    vector<vector> list(N,vector(N));
    int max_f,max_b = 0;
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){ 
            cin >> list.at(i).at(j);
        }
    }
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(i != 0 && j != 0 && i != N-1 && j != N-1){
                max_f = *max_element(&list.at(0).at(j),&list.at(i-1).at(j));
                max_b = *max_element(&list.at(i+1).at(j),&list.at(N-1).at(j));
                cout << max_f << " " << max_b << endl;
            }
        }
    }

Nに任意の数字を入れてN*Nの二次元配列を作る。二次元配列の要素にも任意の数字を入れる。
今回は指定した要素の前後にある最大の値をもとめたかったのに数値がおかしくなった。範囲指定が悪かったのかもわからない。
プログラムは下の入力値の真ん中の4つが対象になる。例えば左から2つ目の4だと、自身の前側にある一番大きな数は3で自身の後ろ側にある一番大きな数は6になる。
入力値

4
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6

期待する出力は

3 6
3 6
4 6
4 6

のはずが

3 33
3 33
33 6
33 6

だった。どこかから33が連れられてきた。33なんて数値はどこにもいれてないはずだったのこまった。普通に考えてmax_elementの指定の仕方に問題があると思われたのでそこをなおそうと試みた。
いろいろと試行錯誤した結果begin()とend()を使うことになった。あと無理やり配列を一次元にした。
このchangeってやつ。なんで一次元にしかというとbegin()とend()を直接縦に使う方法を知らなかったから。横だとすぐ使える。
max_sみたいな感じ(即興で書いたのでエラー出るかも)

    vector change(N);
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(i != 0 && j != 0 && i != N-1 && j != N-1){
                for(int k=0;k<N;k++){
                    change.at(k) = list.at(k).at(j);
                }
                //max_s = *max_element(&list.at(i).begin(),&list.at(i).end());
                max_f = *max_element(change.begin(),change.begin()+i);
                max_b = *max_element(change.begin()+i+1,change.end());
                cout << max_f << " " << max_b << endl;
            }
        }
    }

今回のことでbegin()とend()のみを使うようにしようと思った。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA