gpt4 book ai didi

c++ - 使用迭代器实现状态机(ala 生成器)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:33 25 4
gpt4 key购买 nike

最近我一直需要实现生成一堆数字的小类。如果 C++ 有像 python 这样的生成器,那将是非常方便的,但不幸的是,事实并非如此。

所以我一直在思考如何最好地实现这些类型的对象,以便于迭代和组合。当我们想到容器上的迭代器时,它们基本上只保存元素的索引,并且大部分信息都在容器本身中。这允许多个迭代器同时引用集合中的不同元素。

谈到状态机时,显然迭代器必须保持整个状态,因为多个迭代器需要能够独立。从这个意义上说,状态机类更像是这些迭代器的“构建器”,这些迭代器是实际的状态机。

作为玩具示例,我已经实现了可以在循环中使用的范围生成器(ala xrange in python):

// using range-for from c++11
for (auto i : range<int>(1, 30)) {
cout << i << endl;
}

代码可以在 my bitbucket 上找到.

也就是说,将整个状态存储在迭代器中是很尴尬的,因为创建 end() 迭代器只是为了比较结束状态,如果状态是大量成员。

有没有用简单的线性状态机完成任何事情,并用迭代器循环它们?

最佳答案

如果您只支持正向迭代,您可以为 end() 使用与 begin() 不同的类型。这是基本思想

class iterator;

class iterator_end {
typedef ... value_type;
...

iterator& operator++ () { throw ... }
value_type operator* () { throw ... }
bool operator== (const iterator& e) const { return e == *this; }
}

class iterator {
typedef ... value_type;
..

iterator& operator++ () { ... }
value_type operator* () { ... }
bool operator== (const iterator_end& e) const { return are_we_done_yet }
}

class statemachine {
iterator begin() const { ... }
iterator_end end() const { ... }
}

虽然我从来没有尝试过,所以我不能保证这会奏效。您的状态机的 iteratorconst_iterator typedef 将指定与 end() 返回不同的类型,这可能会或可能不会导致问题。

另一种可能性是使用 pimpl 的变体,它使用 boost::optional。将迭代器状态放入单独的类中,并将其存储在迭代器内的 boost::optional 中。保留由 end() 返回的迭代器的状态。你不会节省任何内存,但你避免了堆分配(boost::optional 不做任何事情,它使用 placement new!)和初始化开销。

关于c++ - 使用迭代器实现状态机(ala 生成器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com