我想将函数返回的范围连接到一个大范围内。考虑以下代码:
some_type_i_cant_figure_out bar() {
typedef std::vector<int>::const_iterator iter;
std::vector<int> aaa;
/* fill some data into aaa*/
some_type_i_cant_figure_out cc;
for (int i = 0; i < aaa.size(); ++i) {
std::pair<iter, iter> bbb = foo(aaa, i);
ccc = boost::join(ccc, bbb);
}
return ccc;
}
我想要实现的目标:
aaa矢量很大,foo可能会返回相当大的范围。当然,我可以创建范围内所有元素的副本到新的整数向量并返回它。它效率低下,浪费内存和时间。所以我想返回一个boost :: joined_range。在最坏的情况下,我可以使用范围向量,但它会太简单而不是那么优雅:)
除了join_range不是默认的可构造的(这个示例实现有问题)什么是返回值类型?临时变量(ccc)类型以及实现上述目的的正确和优雅方式是什么?
答案 0 :(得分:1)
首先,您的代码的最终结果似乎与
类似auto cc(aaa);
boost::stable_sort(cc);
(假设,从您的示例代码中,aaa
包含[0..size()-1)
范围内的整数
如果您可以简单地复制,只需使用backinsert迭代器:
std::vector<int> cc;
for (size_t i = 0; i < aaa.size(); ++i)
boost::copy(boost::equal_range(aaa, i), back_inserter(cc));
否则,您可以使用any_range
隐藏累积联接:
boost::any_range<int, boost::forward_traversal_tag, int> r;
for (size_t i = 0; i < aaa.size(); ++i)
r = boost::join(r, boost::equal_range(aaa, i));
<强> Live On Coliru 强>
#include <boost/range/any_range.hpp>
#include <boost/range/join.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>
int main() {
std::vector<int> const aaa { 1,1,1,4,5,5,9,42,42,42,42,42,42 };
boost::any_range<int, boost::forward_traversal_tag, int> r;
for (size_t i = 0; i < aaa.size(); ++i)
r = boost::join(r, boost::equal_range(aaa, i));
boost::copy(r, std::ostream_iterator<int>(std::cout << "result: ", " "));
}
打印
result: 1 1 1 4 5 5 9