Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 枚举输入数据序列的方法_C++_Design Patterns_Styles_Iteration_Traversal - Fatal编程技术网

C++ 枚举输入数据序列的方法

C++ 枚举输入数据序列的方法,c++,design-patterns,styles,iteration,traversal,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 unintui

有两种方法可以遍历和处理一系列数据,但当事情变得更加复杂时,也会变得相当困难

如果每个操作都是独立的,那么生活就简单了:

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