gpt4 book ai didi

c++ - 如何编写可以返回迭代器或反向迭代器的 C++ 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:34 25 4
gpt4 key购买 nike

据我所知,在 C++ 中,没有涵盖 iterator 和 reverse_iterator 的公共(public)基类。

到目前为止我看到的唯一建议是使用模板来解决这个问题( How to write a function that takes an iterator or collection in a generic way? )

但是这个解决方案似乎对我不起作用。

class MyClass
{
template<typename Iter> Iter* generate_iterator(...params...)
{
//returns either a vector::iterator or vector::reverse_iterator
}
template<typename Iter> void do_stuff(Iter *begin, Iter *end)
{
//does stuff between elements specified by begin and end
//I would like this function to remain agnostic of which direction it is working in!
}
void caller()
{
//I would like this function to remain agnostic of which direction it is working in too...
do_stuff(generate_iterator(blah),generate_iterator(foo));
}
};

在这种情况下,generate_iterator() 不能按需要使用,因为编译器提示“generate_iterator 不是 MyClass 类的成员”,大概是因为我没有指定它(我在实践中不能指定它,因为调用者应该是不可知的迭代器类型)。

有人可以帮忙吗?提前致谢!

编辑:正如 Mark B 指出的那样,generate_iterator 必须返回一个指针 - 现在已更正

更新:刚开始使用这个http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/start_page.html它似乎工作...

最佳答案

您可以创建自己的迭代器类,它知道如何进行双向操作。封装两种类型的迭代器,并在内部选择您初始化时使用的任何一种。

这是一个开始:

template<typename Container>
class BiIterator
{
public:
BiIterator(Container::iterator i) : m_fwd(i), m_isforward(true) {}
BiIterator(Container::reverse_iterator i) : m_rev(i), m_isforward(false) {}
bool operator==(const BiIterator & left, const BiIterator & right);
Container::value_type & operator*()
{
if (m_isforward)
return *m_fwd;
return *m_rev;
}
const Container::value_type & operator*() const;
BiIterator & operator++()
{
if (m_isforward)
++m_fwd;
else
++m_rev;
return *this;
}
private:
Container::iterator m_fwd;
Container::reverse_iterator m_rev;
bool m_isforward;
};

关于c++ - 如何编写可以返回迭代器或反向迭代器的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707886/

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