枚举输入数据序列的方法

时间:2017-02-28 12:55:46

标签: c++ design-patterns styles iteration traversal

有几种方法可以遍历和处理一系列数据,但是当事情变得更复杂时,它也变得非常困难。

如果每项操作都是独立的,那么生活很简单:

[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())
{
    // ...
}

我想知道是否还有其他更好的风格来处理这类问题。

0 个答案:

没有答案