我有一个“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/