如何创建一个指向" first"的迭代器?和"第二"但仍然可以用c ++递增?

时间:2017-06-13 00:19:08

标签: c++ iterator

我正在寻找为我制作的特工创建一个迭代器。迭代器需要指向成员"首先"和"第二"使用箭头操作符,但它不能成为指针,因为我需要能够使用++运算符等来递增它。

这可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:-3)

您应该考虑使用std :: iterator。使第二个模板参数成为一对,并且==以检测最上面的项目何时到达结尾,或者如果要在{last,first}对之前进行迭代,则检测最下面的项目。您也可以通过容器的begin()函数将容器的end()存储在迭代器中。

这个示例代码有些不相关,但它会让您了解所涉及的工作,而不是真的,并且展示了如何使用该类。它是一个自定义迭代器,用于通过pcap返回的网络接口进行慢跑,

// *********************************************************************************************************************************
//
//  pcap interface list.
//
//  usage:
//
//  PCapInterfaceList interfaces;
//  if (!interfaces)
//  {
//      std::cout << "pcap error: " << interfaces.GetErrorMessage() << std::endl; 
//  }
//  else
//  {
//      std::cout << "interface count: " << interfaces.size() << std::endl; 
//      for (auto& interface : interfaces) 
//      {
//          std::cout << inteface.name << std::endl;
//          ...
//      }
//  }
//
class PCapInterfaceList
{
    // -------------------------------------------------------------------------
    // allows the use of standard constructs on this list
public:
    struct const_iterator : public std::iterator<std::forward_iterator_tag, const pcap_if_t>
    {
    private:
        const pcap_if_t* pos;

    public:
        explicit const_iterator(const pcap_if_t* itm) : pos(itm) {}

        const_iterator& operator++() { pos = pos->next; return *this; }
        const_iterator operator++(int) { const_iterator retval = *this; ++(*this); return retval; }
        bool operator==(const_iterator other) const { return pos == other.pos; }
        bool operator!=(const_iterator other) const { return !(*this == other); }
        reference operator*() const { return *pos; }
    };

    const_iterator begin() const { return const_iterator(ifs); }
    const_iterator end()   const { return const_iterator(nullptr); }

    // -------------------------------------------------------------------------
public:
    PCapInterfaceList() : ifs(nullptr)
    {
        errMsg[0] = 0;
        if (pcap_findalldevs(&ifs, errMsg) < 0)
        {
            ifs = nullptr;
        }
    }

    // -------------------------------------------------------------------------

    ~PCapInterfaceList() { if (ifs) pcap_freealldevs(ifs); }

    // -------------------------------------------------------------------------

    operator bool() const               { return !Error(); }

    // -------------------------------------------------------------------------

    size_t size() const
    {
        size_t result = 0;
        for (auto i : *this) ++result; 
        return result;
    }

    // -------------------------------------------------------------------------

    bool empty() const { return ifs == nullptr; }

    // -------------------------------------------------------------------------

    const char *GetErrorMessage() const { return errMsg; }
    const bool Error () const { return errMsg[0] != 0; }

    // -------------------------------------------------------------------------

    const pcap_if_t& operator[] (size_t n) const
    {
        auto i = begin();
        while (n-- && i != end()) { ++i; }
        if (i == end()) 
        {
            throw std::out_of_range("in PCapInterfaceList");
        }
        return *i;
    }

    // -------------------------------------------------------------------------
private:
    pcap_if_t *ifs;
    char errMsg[PCAP_ERRBUF_SIZE];
};