for循环 - 迭代特定元素

时间:2017-11-25 13:42:46

标签: c++ loops for-loop

我有以下数据结构:

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语句的情况下实现?

2 个答案:

答案 0 :(得分:1)

只需编写包装器迭代器类和范围类。

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

这是一个实现迭代器包装迭代器的例子。

另一种方法是使用Sprout

sprout::optional是容器类型,因此您可以像下面这样写:

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

答案 1 :(得分: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];
        // ...
    }
}

如果不了解问题的背景,是否值得这么麻烦很难说。

请注意,如果您的编译器已经支持T,您可以将std::optional<std::string>替换为std::optional