gpt4 book ai didi

c++ - 在循环中附加范围

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

我想将函数返回的范围连接成一个大范围。考虑以下代码:

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 vector 很大,foo 可能会返回相当大的范围。当然,我可以将范围内所有元素的拷贝创建到新的整数 vector 中并返回它。它效率低下,浪费内存和时间。所以我想返回一个 boost::joined_range。在最坏的情况下,我可以接受范围 vector ,但它太简单而且不那么优雅:)除了 joined_range 不是默认构造的(这对于这个示例实现来说是一个问题)返回值类型是什么?临时变量 (ccc) 类型以及实现上述目标的正确且优雅的方法是什么?

最佳答案

首先,您的代码的最终结果看起来类似于

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

关于c++ - 在循环中附加范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27012395/

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