带有移动端的前向迭代器()

时间:2016-10-14 19:39:03

标签: c++ c++11 stl

所以,我正在设计一个连接(通过网络)服务以接收一些数据的类。我不知道我将提前收到的人数据点数。然而我想知道,如果有一种方法可以使用forward_iterator使这个类可迭代,以便充分享受STL的荣耀。我的想法是这样的:

self_type operator++() {
  // if there are some locally cached data points left return next
  // else connect to service again to receive the next batch of data
}

但是,由于我无法提供有效的end(),我很好奇,如果这仍然可以做到。

替代(和无迭代器)接口可能看起来像:

bool hasMoreDataPoints() const;
DataPoint& getNext();

显然不适用于任何STL算法。

3 个答案:

答案 0 :(得分:4)

标准库对istream_iterator执行操作:当数据用完时,设置迭代器状态,使其等于该类型的默认构造对象。然后就是你的end()等价物。

答案 1 :(得分:0)

我认为您的类中存在某种类型的存储空间用于缓存,例如:一个std::vector。然后,您可以公开其std::begin()std::end()迭代器(以所有常用形式)。算法然后直接处理底层容器,并使用容器迭代器的成员函数,如operator++operator==等。

如果您需要引入更多逻辑,则需要创建自定义迭代器。这可以基本上通过组合来完成,即编写一个包含与存储容器相对应的迭代器的新类,并在相应调整它时公开所需的所有功能。

编辑:如你所说,你使用一个清单:

struct DataPoints
{
    std::list<double> _list; 
    auto begin() const
    {
        return _list.begin();
    }
    auto end() const
    {
        return _list.end();
    }
    //other versions: non-const begin and end, cbegin, cend
}

这就是简单的方法。您可以将其用作普通列表:

DataPoints d;
std::find(d.begin(), d.end(), 10.0);

如上所述,如果您需要更多逻辑,则可能需要编写自定义迭代器。

答案 2 :(得分:0)

  

但是,由于我无法提供有效的结尾(),我很好奇,如果这仍然是可能的 ......

您可以使用STL附带的任何容器类。 假设您正在使用向量或列表或任何其他合适的容器。只需使用STL提供的内容并编写自己的包装器

vector<datapoint> mydpvector;

//as data comes in
mydpvector.push_back(newdp);

vector<datapoint>::const_iterator cit=mydpvector.begin();
//now iterate everytime over the container

for(cit;cit!=mydpvector.end();cit++)
{
//get the data you need
}

//alternately if you need just the last element do this
mostrecentdp = mydpvector.back();