2016-08-07 8 views
0

次のコードは、宣言された配列のすべての要素が奇数であるかどうかをチェックします。all_of配列の一部のすべての要素の条件を検査する関数

#include "stdafx.h" 
#include <iostream>  // std::cout 
#include <algorithm> // std::all_of 
#include <array>  // std::array 

int main() { 
    std::array<int,8> foo = {3,5,7,11,13,17,19,23}; 

    if (std::all_of(foo.begin(), foo.end(), [](int i){return i%2;})) 
     std::cout << "All the elements are odd numbers.\n"; 

    return 0; 
} 

(サンプルがhttp://www.cplusplus.com/reference/algorithm/all_ofから採取された)

どうかチェックしたいfoo[2]から出発して宣言された配列のすべての要素は奇数です。

foo.begin()foo[2]に置き換えても機能しません。私は、この作業を行うために他の多くのものを試しました。非常に基本的なもの(ここでは非常に基本的なC++ユーザー)です。私はこれを達成するために配列のサイズを変更したくありません。

最終的に、私はちょうどの一部のいずれかの要素上の条件についてforループチェックなど、条件は、アレイの一部の上のすべてのの要素のためにチェックされているループを持っている探していますアレイ。これはRで実現するのは比較的簡単ですし、C++で実現するのも同じことが期待されます。

+3

'foo.begin()を' foo.begin()+ 2'に置き換えていますか? – DimChtz

+0

ありがとうございます。それはうまくいった!これで一日中過ごした。乾杯。 – Krug

+0

'foo.begin()'は 'iterator'、' foo [2] 'は値です。 – Jarod42

答えて

3

ここでイテレータと要素を使用することはできませんが、範囲を表すものではありません。より一般的な意味では、要素とイテレータへのポインタを使用しようとしても、指定されたコンテナのすべての実装のどちらに対しても十分に定義されません。

begin()イテレータからfoo[2]要素までインクリメントするには、std::next(it.begin(), 2)を使用し、2つのイテレータで範囲を反復処理する必要があります。

std::all_of(std::next(foo.begin(), 2), foo.end(), 
    [](int i){/*...*/}) 

std::next()より一般的であり(例えば、代替it.begin() + 2用)だけランダム・アクセス・イテレータ以外のイテレータのために応えます。それに引き渡されるイテレータのタイプではまだパフォーマンスが向上します。

+0

'foo.begin()+ 2'以上の利点はありますか? – Krug

+1

あなたが持っているランダムアクセスイテレータの場合、同じことになるでしょう。コンテナの変更や他のメンテナンスの変更など、より堅牢なコードのためのnextの使用や、コードを読む際のコードの明快さに対するいくつかの個人的な好みが好きです。どちらも期待どおりに動作します。 – Niall

+0

@Niall - 一方、コンテナがランダムアクセスイテレータを提供しない型に変更された場合、 'std :: next'は(潜在的に大きな)パフォーマンスヒットをもたらし、' begin()+ 2'は ' tコンパイルします。 –

関連する問題