2

再帰関数を使用してベクトルの値を出力したいと考えています。

void pvec(int cnt, std::vector<int> vec) {
    if(cnt < vec.size()) {
        std::cout << vec[cnt++] << std::endl;
        return pvec(cnt,vec);
    }
}

ベクトル添え字を使用する代わりに、イテレータを使用したかったのです。ただし、最初の引数に反復子を渡し、インクリメントされた反復子で関数を返そうとする同様の関数を作成すると、ループが停止せず、セグメンテーション違反が発生します。どうしてこれなの?

void pvec(std::vector<int>::iterator po, std::vector<int> vec)
{
    if(po < vec.end()) {
        std::cout << *po++ << std::endl;
        return pvec(po,vec);
    }
}

po を参照にしようとしましたが、これもうまくいきませんでした。

4

3 に答える 3

4
  • *vec.end() は正しくありません。
  • 戻り値の目的は何ですか?
  • 毎回ベクトルをコピーしないように参照を使用する必要があります。
  • いくつかの一貫性を追加します。

修正版:

void pvec(std::vector<int>::const_iterator po, const std::vector<int>& vec)
{
    if(po != vec.end()) {
        std::cout << *po++ << std::endl;
        pvec(po, vec);
    }
}

クラッシュは *vec.end() から発生します。「奇妙なループ動作」は、異なるベクトルからの反復子の比較から発生します (ベクトルは毎回コピーされるため)。

于 2013-08-29T16:51:09.507 に答える
1

あなたの問題は、「vec」引数がコピーで渡されるため、再帰関数を呼び出すたびに新しいベクターオブジェクトが生成され、異なるベクターの反復子を比較するのは単に間違っていることです。そのため、比較「po < vec.end()」と再帰は決して終了しません。

また、値を返す目的がわかりません。定数参照で渡すように 2 番目の引数を修正し、何も返さないようにする必要があります。

void pvec(std::vector<int>::iterator po, const std::vector<int>& vec)
{
    if(po < vec.end()) {
        std::cout << *po++ << std::endl;
        pvec(po,vec);
    }    
} 
于 2013-08-29T16:54:35.440 に答える