我有以下数据结构:
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语句的情况下实现?
答案 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
。