如果序列非常长,您可能希望按顺序获取每个结果,而不存储列表,并在执行过程中丢弃重复项。
#include <vector>
template<typename ASqs, typename Action>
void arithmetic_sequence_union(ASqs arithmetic_sequences, Action action)
{
using ASq = ASqs::value_type;
using T = ASq::value_type;
std::vector<ASq> remaining_asqs(begin(arithmetic_sequences), end(arithmetic_sequences));
while (remaining_asqs.size()) {
T current_value = **std::min_element(begin(remaining_asqs), end(remaining_asqs),
[](auto seq1, auto seq2) { return *seq1 < *seq2; }
);
for (size_t seq_index = 0; seq_index < remaining_asqs.size(); )
{
ASq &asq = remaining_asqs[seq_index];
if (current_value == *asq
&& !++asq) {
remaining_asqs.erase(begin(remaining_asqs) + seq_index);
}
else {
++seq_index;
}
}
action(current_value);
}
}
这需要在“生成器”类型对象中呈现范围。可能看起来非常像已检查迭代器的实现,但迭代器不公开知道它们处于序列末尾的概念,因此我们可能需要自己编写简单的生成器。
template <typename ValueType, typename DifferenceType>
class arithmetic_sequence {
public:
using value_type = ValueType;
using difference_type = DifferenceType;
arithmetic_sequence(value_type start, difference_type stride, value_type size) :
start_(start), stride_(stride), size_(size) {}
arithmetic_sequence() = default;
operator bool() { return size_ > 0; }
value_type operator*() const { return start_; }
arithmetic_sequence &operator++() { --size_; start_ += stride_; return *this;}
private:
value_type start_;
difference_type stride_;
value_type size_;
};
测试示例:
#include "sequence_union.h"
#include "arithmetic_sequence.h"
#include <cstddef>
#include <array>
#include <algorithm>
#include <iostream>
using Number = uint32_t;
struct Range {
Number first;
Number last;
Number interval;
};
using Range_seq = arithmetic_sequence<Number, Number>;
Range_seq range2seq(Range range)
{
return Range_seq(range.first, range.interval, (range.last - range.first) / range.interval + 1 );
}
int main() {
std::array<Range, 2> ranges = { { { 2,14,3 },{ 2,18,2 } } };
std::array<Range_seq, 2> arithmetic_sequences;
std::transform(begin(ranges), end(ranges), begin(arithmetic_sequences), range2seq);
std::vector<size_t> results;
arithmetic_sequence_union(
arithmetic_sequences,
[&results](auto item) {std::cout << item << "; "; }
);
return 0;
}
std::merge()
对你不起作用吗? - πάντα ῥεῖRange
中的数字填充一个std::vector<Number>
,然后将这些向量进行std::merge
吗? - Indiana Kernickstd::min(a.first, a.first)
你的意思是什么?对于整个问题,你想得到什么?还有interval
是什么? - apple apple1
可能会出现在多个范围或列表中,但您只想对其进行一次迭代? - Pandatyr