有几种方法可以遍历和处理一系列数据,但是当事情变得更复杂时,它也变得非常困难。
如果每项操作都是独立的,那么生活很简单:
[1]修改
for(auto&& x : v)
x += 1;
[2]访问
for(const auto& x : v)
sum += x;
如果事情变得更复杂,处理元素的方法依赖于上下文(例如解析)。然后我们必须维护一个自动机:
[1]显式状态
// I think this method is quite unintuitive though
auto state = kDefaultState;
for(const auto& x : v)
{
if(state == kFirstState)
{
// deal with x...
// transfer state
}
else if(state == kSecondState)
{
// deal with x...
// transfer state
}
else
{
// ...
}
}
[2]隐藏在代码流中的隐式状态(创建一个读者类)
// this method require a lot more extra coding and redundant bound check
auto reader = CreateReader(...);
while(reader.Exhausted())
{
if(reader.Try(...))
{
// ...
}
}
while(reader.Exhausted())
{
// ...
}
我想知道是否还有其他更好的风格来处理这类问题。