-1

次のようなコードがあります。

bool finished = false;
size_t offset = 0;
for (Iter i = items.begin();
          i != items.end() || (finished = !finished);
          finished ? i : ++i, ++offset)
{
    do_some_work();
    if (some_condition(other_collection[offset]))
    {
        i = items.insert(i, new_value());
        do_more_work();
        if (blah) { continue; }
    }
    do_more_work();
}

目標は、を含むend()すべてのイテレータに対して本体を実行することです。

Visual C++ などのコンパイラから「条件式内の割り当て」警告が表示されます。

これらの警告を回避する最も簡単な方法は何ですか?

私はそれらをオフにしたくありません (それらは役に立ちます)。また#pragmas を挿入したくありません (コンパイラ間で移植性がありません)。
典型的なコンパイラに「はい、ここに代入するつもりです」と伝える短いものを書きたいだけです。

私が見つけた最も簡単な解決策は、関数 (例: assign) を作成して代わりに呼び出すことですが、このためだけに新しい関数を定義することを回避する方法があるかどうか疑問に思っています。

4

5 に答える 5

5

古き良きを使用してくださいfor i

#include <vector>
#include <iostream>


int main() {
    std::vector<int> v = { 1, 5, 23, 2, 44 };
    auto iter = v.begin();
    for (std::size_t i = 0; i != v.size() + 1; ++i, ++iter) {
        if(iter == v.end()) {
            std::cout << "END!" << std::endl;
        }
        else {
            std::cout << *iter << std::endl;
        }
    }
}

ライブコード


更新:あなたのコメントに応えて、代わりに使用するコードを修正しましたstd::distance。これにより、反復子の範囲のサイズを直接知らなくても反復子のみを使用できるようになりました。

#include <vector>
#include <iostream>


template<typename IterType>
void print(IterType iter /* begin */, IterType end) {
    auto size = std::distance(iter, end);
    for (decltype(size) i = 0; i != size + 1; ++i, ++iter) {
        if(iter == end) {
            std::cout << "END!" << std::endl;
        }
        else {
            std::cout << *iter << std::endl;
        }
    }
}


int main() {
    std::vector<int> v = { 1, 5, 23, 2, 44 };
    print(v.begin(), v.end());
}

ライブコード

于 2013-08-19T04:32:05.063 に答える
3

for のループを実行するend場合、たとえそれが に等しい場合でもbegin、ループは常に少なくとも 1 回実行されます。

その場合、do/ループとして記述するのがおそらく最も簡単なので、ループ本体を実行したwhileにのみ条件をテストします。

bool continuing;
i = begin;
do { 
    whatever();
} while ((continuing = (i != end)) && (++i, continuing));

醜い終了条件は、イテレータの現在の値を end に対してテストし、別のイテレーションを実行する必要がある場合 (および必要な場合にのみ)、次のイテレーションのためにイテレータをインクリメントします (その後、元の比較からの値を使用してループを続行/中断します)。 .

于 2013-08-19T04:34:37.267 に答える