c++ - C++ 的自定义迭代器函数

标签 c++ function c++11 vector iterator

我有一个“T”类型的对象集合,我想遍历它。 “T”类型的对象有两个重要的属性:

int r; // row number
int c; // column number 

我想定义一个迭代器,它允许我遍历集合中的所有元素。

这可以通过以下方式完成:

std::vector<T> v;

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    ....
}

但是,我希望迭代器多一个属性。我希望能够打电话

it.nextrow()

调用此函数应返回 v 的元素“e”,其中 e.r + 1 = ec.r 和 e.c = ec.c,其中 ec 是迭代器指向的当前元素。 IE。调用 it.nextrow() 应该给我一个指向列相同但行递增 1 的元素的指针。希望这是有道理的。

我不确定我需要做什么才能让它工作,因为我对高级 C++ 概念还很陌生。谁能帮帮我?

最佳答案

并不是所有的东西都必须是成员函数。你会接受一个 iterator nextRow(iterator current, iterator begin, iterator end) 自由函数吗?

template<typename Iterator>
Iterator nextRow(Iterator needle, Iterator begin, Iterator end)
{
    return std::find_if(begin, end, [needle](const T & elem) { return (elem.r == needle->r + 1) && (elem.c == needle->c); });
}

如果你的 vector 总是排序的,你不需要一个单独的开始,只需要使用针。

如果您确实需要它成为包装迭代器的一部分,则该类型将需要包含开始和结束。

template <typename Iterator>
class SearchableIterator
{
    Iterator wrapped, begin, end;
public:
    difference_type     Iterator::difference_type;
    value_type          Iterator::value_type;
    pointer             Iterator::pointer;
    reference           Iterator::reference
    iterator_category   Iterator::iterator_category

    SearchableIterator(Iterator wrapped, Iterator begin, Iterator end)
      : wrapped(wrapped), begin(begin), end(end) {}

    // All the members, calling that member of wrapped (see std::reverse_iterator for guidance)

    SearchableIterator nextRow()
    {
        return SearchableIterator(std::find_if(begin, end, [this](const T & elem) { return (elem.r == wrapped->r + 1) && (elem.c == wrapped->c); }), begin, end);
    }
}

关于c++ - C++ 的自定义迭代器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47551171/

相关文章:

c++ - 从支持 OpenSSL 支持的源代码构建 Qt 静态

c++ - 非类型模板参数和要求

c++ - 如何在 C++ 中初始化列表 vector ?

c++ - SIMD 的偏好是始终摆脱分支吗?

c - 将数据类型分配给用户定义的函数

php - 如何将 PHP 变量名传递给 Javascript 函数

转换为函数

c++ - decltype 在不生成代码的模板方法上抛出错误

c++ - 使用enable_if在按值传递与按引用传递之间更改函数声明

c++ - g++ 和 clang++ SFINAE 和 SFINAE 失败的不同行为