gpt4 book ai didi

c++ - 具有四个迭代器的类复制算法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:34 24 4
gpt4 key购买 nike

是否有类似 std::copy 的算法接受四个迭代器,表示两个范围?

基本上,只要任一范围用完,它就应该停止复制:

template<typename Iter>
void copy_range(Iter begin1, Iter end1, Iter begin2, Iter end2)
{
for (; (begin1 != end1) && (begin2 != end2); ++begin1, ++begin2)
{
*begin2 = *begin1;
}
}

最佳答案

不,可悲的是没有这样的事情。最接近的是 std::copy_n

当然还有您刚刚编写的算法。

根据使用的迭代器类型(随机或非随机),使用它比您的算法更有效(因为每次迭代只需要进行一次检查):

std::copy_n(begin1,
std::min(std::distance(begin1, end1), std::distance(begin2, end2)),
begin2);

另一种选择是检查输出迭代器,类似于此(粗略草图,未检查代码):

template<class Iter>
class CheckedOutputIter {
public:
// exception used for breaking loops
class Sentinel { }

CheckedOutputIter()
: begin(), end() { }

CheckedOutputIter(Iter begin, Iter end)
: begin(begin), end(end) { }

CheckedOutputIter& operator++() {
// increment pas end?
if (begin == end) {
throw Sentinel();
}

++begin;
return *this;
}

CheckedOutputIter operator++(int) {
// increment past end?
if (begin == end) {
throw Sentinel();
}

CheckedOutputIter tmp(*this);

++begin;

return tmp;
}

typename iterator_traits<Iter>::value_type operator*() {
return *begin;
}


private:
Iter begin, end;
};

用法:

try {
std::copy(begin1, end1, CheckedOutputIter(begin2, end2));
} catch(const CheckedOutputIter::Sentinel&) { }

这与您的解决方案的性能大致相同,但用途更广泛。

关于c++ - 具有四个迭代器的类复制算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11560692/

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