gpt4 book ai didi

c++ - 如何返回 iterator_range

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:39 26 4
gpt4 key购买 nike

我想创建并保留一个 iterator_range。该范围是基于谓词构建的(对于这个例子,我寻找偶数)。

我可以做到这一点,但似乎我必须从正在迭代的底层 vector 中复制元素。

请在下面的示例中查找标记为“>>>”的评论。

有没有一种方法可以创建 iterator_range 而不必从原始 vector 创建条目的拷贝?

我看过,但没有看到针对这种特殊情况的答案。

#include <vector>
#include <iostream>

#include <boost/bind.hpp>
#include <boost/range.hpp>
#include <boost/foreach.hpp>
#include <boost/iterator/filter_iterator.hpp>
#include <boost/range/iterator_range.hpp>

using namespace std;
using namespace boost;

typedef boost::iterator_range<vector<int>::iterator> int_range;

template< class Range, class Pred >
boost::iterator_range< boost::filter_iterator< Pred, typename boost::range_iterator<Range>::type > >
make_filter_range( Range& rng, Pred pred ) {
return boost::make_iterator_range(
boost::make_filter_iterator(pred, boost::begin(rng), boost::end(rng)),
boost::make_filter_iterator(pred, boost::end(rng), boost::end(rng)) );
}

// This is the predicate evaluation function.
bool IsEvenFilter(int val) { return val % 2 == 0; }

void TestMakeIteratorRange()
{
std::vector<int> vals;
vals.push_back(1);
vals.push_back(4);
vals.push_back(7);
vals.push_back(11);
vals.push_back(16);
vals.push_back(19);
vals.push_back(28);

//>>> The following int_range line does not compile. Why?
//>>> How can I return an int_range?
//>>> int_range intRange = make_filter_range( vals, boost::bind(&IsEvenFilter, _1));

//>>> The following WILL work, but it forces a second copy of elements from vals.
std::vector<int> v2 = boost::copy_range< std::vector<int> >(
make_filter_range( vals, boost::bind(&IsEvenFilter, _1)));

int_range intRange = int_range(v2);

// Dump out contents
BOOST_FOREACH(int &val, intRange)
{
cout << " " << val;
}
cout << endl;
}

void main()
{
TestMakeIteratorRange();
}

最佳答案

int_range intRange = make_filter_range( vals, boost::bind(&IsEvenFilter, _1));

您必须存储 make_filter_range 返回的类型。 不是 int_range

顺便说一句,这就是 auto 存在的原因(在 C++11 中);这样,如果您想存储函数返回的内容,就不必键入该返回值。如果您无权访问 C++11 auto,请使用 BOOST_AUTO相反。

如果由于某种原因你不能使用它,你也可以使用 any_range.顾名思义,它可以存储特定类型的任何范围。

此外,请考虑使用 proper Boost range-adapters , 比如 boost::adaptors::filtered而不是 make_filter_iterator

关于c++ - 如何返回 iterator_range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054608/

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