2017-11-25 1 views
0

を反復処理:- 私は次のようなデータ構造を持っている特定の要素

struct T 
{ 
    std::string name; 
    bool active; 
}; 

をその後、私はTのベクトルを反復処理したいだけの能動素子のために:

std::vector<T> myVector; 
//fill vector 
for(const auto& item: myVector) 
{ 
    if(!item.active) 
    { 
     continue; 
    } 
    //do something; 
} 

がありますif文および/またはcontinue文を使用せずにそれを実現できる任意の機能?

+1

いいえコメントを記入する必要があります –

+0

あなたが尋ねることに応じて、まずはアクティブなメンバーは必要ありません。 – NiVeR

+0

条件を逆にして、 'if'の中で何かをしますか? –

答えて

1

ラッパーイテレータクラスと範囲クラスを書きます。

https://gist.github.com/yumetodo/b0f82fc44e0e4d842c45f7596a6a0b49

これはイテレータラッピングイテレータを実装する例です。


もう1つの方法はSproutです。あなたは以下のように書くことができるように

sprout::optionalは、コンテナタイプです:

std::vector<sprout::optional<std::string>> myVector; 
//fill vector 
for(auto&& e : myVector) for(auto&& s : e) 
{ 
    //do something; 
} 
1

あなたが本当にチェックを排除したいとちょうどactive要素のインデックスを格納するために別の容器を使用し、その後、それを隠すない場合が真である場合は、forループを他のコンテナのすべてのインデックスを通過するループに置き換えます。

ベクターが変更されるたびにインデックスコンテナが更新されるようにしてください。

#include <string> 
#include <vector> 

struct T 
{ 
    std::string name; 
    bool active; 
}; 

int main() 
{ 
    std::vector<T> myVector; 
    using Index = decltype(myVector)::size_type; 
    std::vector<Index> indicesActive; 

    // ... 

    for (auto index : indicesActive) 
    { 
     auto const& item = myVector[index]; 
     // ... 
    } 
} 

問題の文脈を知らなくても問題があるかどうかは分かりません。あなたのコンパイラがすでにstd::optionalをサポートしている場合、あなたはおそらくstd::optional<std::string>であなたのTを置き換えることができ


注意。

関連する問題