gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:40:09 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com