2

次のようなコードを取得しました。

template<class Iter>
void printRange(Iter begin, Iter last) {
    for (Iter i = begin; i != last; i++) {
        std::cout << *i << ", ";
    }
     outstd::cout << *last << ", ";
}

私の質問は、最後の要素もエレガントに印刷するにはどうすればよいですか? ループの後に最後の要素を個別にカウントすることは、適切で正しい解決策ではないようです...もっと良い方法はありますか? <= 演算子、ブースト、または stl 固有の機能も使用できないことに注意してください。

4

4 に答える 4

4

STL コンテナー クラスの場合、反復子の値endは最後の項目の後になります。endに到達すると、すべてのアイテムが処理されたため、終了できます。

于 2012-11-21T14:02:01.260 に答える
2

条件付きでセパレーターを出力できます。

template<class Iter>
void printContainer(Iter first, Iter last) {
    for (Iter i = first, end = ++last; i != end; i++) {
        std::cout << (i == first ? "" : ", ") << *i;
    }
}

より標準的な[begin, end)半開放範囲の場合:

template<class Iter>
void printContainer(Iter begin, Iter end) {
    for (Iter i = begin; i != end; i++) {
        std::cout << (i == begin ? "" : ", ") << *i;
    }
}
于 2012-11-21T14:04:12.447 に答える
0

できるよ:

template<class Iter>
void printContainer(Iter begin, Iter last) {
    Iter afterEnd = end;
    afterEnd++;
    for (Iter i = begin; i != afterEnd; i++) {
        std::cout << *i << ", ";
    }
     outstd::cout << *last << ", ";
}

endただし、STL ライブラリ ( などlist.end()) によって指定された場合は、最後の要素の後の値であり++、例外がスローされることに注意してください。

だから私はあなたが持っている方法であなたが持っているコードを使用します。しかし、私がそれを呼び出していたとき、印刷したい最後の値の後に値を渡しました。

于 2012-11-21T14:04:09.510 に答える