gpt4 book ai didi

c++ - 使用带有类型删除的 reverse_iterator

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

我有一个包含和管理一系列对象的类。为了避免泄露这些对象的存储方式,同时允许迭代它们,我决定使用 boost::any_iterator 进行类型删除。

 using my_erased_type_iterator = boost::range_detail::any_iterator<
MyClass,
boost::bidirectional_traversal_tag,
MyClass&,
std::ptrdiff_t>;

我在MyClass中定义了一个函数Begin()End(),它简单的返回容器的begin()end() 用作 my_erased_type_iterator。它完全按照我的意愿工作,MyClass 之外的任何人都不知道我正在使用 vector 来存储对象,除了我在 Myclass 中公开的函数之外,他们也无法访问容器 的界面。

现在,出于多种原因,我需要对对象进行反向迭代。我还需要知道反向迭代器之后的下一个元素(类似于在普通迭代器上调用 std::next(),这对于反向迭代器来说已经不是那么简单了),我可能还需要在该反向迭代器上调用类似 erase() 的函数。

所以对于我的问题:是否有一种优雅的方式来使用类型删除和反向迭代器(以及正向和反向的 const 版本)?我应该使用前向类型删除迭代器并向后迭代吗?我突然想到我可能以错误的方式解决了这个问题,所以我愿意接受任何建议或在需要时澄清我的问题。

最佳答案

请注意 any_iterator是一个实现细节。

我会先回答你的直接问题,然后用 any_range<> 展示方法正如 Boost Range 的公共(public) API 所预期的那样。

1。 make_reverse_iterator

您可以简单地使用 make_reverse_iterator设施来自

Live On Coliru

#include <boost/range.hpp>
#include <boost/range/any_range.hpp>

struct MyClass {
int i;
};

using my_erased_type_iterator = boost::range_detail::any_iterator<
MyClass,
boost::bidirectional_traversal_tag,
MyClass&,
std::ptrdiff_t>;

#include <iostream>
#include <vector>

int main() {
using namespace boost;
std::vector<MyClass> const v { {1}, {2}, {3}, {4} };

for (auto& mc : make_iterator_range(
make_reverse_iterator(v.end()),
make_reverse_iterator(v.begin())))
{
std::cout << mc.i << " ";
}
}

打印

4 3 2 1 

2。 reversed范围适配器:

或者,您可以使用全范围样式并使用 any_range<> :

Live On Coliru

int main() {
std::vector<MyClass> const v { {1}, {2}, {3}, {4} };

boost::any_range_type_generator<decltype(v)>::type x = reverse(v);

for (my_erased_type_const_iterator f = boost::begin(x), l = boost::end(x); f!=l; ++f) {
std::cout << f->i << " ";
}

}

关于c++ - 使用带有类型删除的 reverse_iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35025489/

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