我正在寻找为我制作的特工创建一个迭代器。迭代器需要指向成员"首先"和"第二"使用箭头操作符,但它不能成为指针,因为我需要能够使用++运算符等来递增它。
这可能吗?如果是这样,怎么样?
答案 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];
};