gpt4 book ai didi

c++ - 使用先前已 move 的输出迭代器调用 move() 是标准 C++ 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:42 26 4
gpt4 key购买 nike

在复习算法设计和学习 C++11 的同时,我想到了以下堆排序实现:

template <typename It, typename Comp>
void heapSort(It begin, It end, Comp compFunc, std::random_access_iterator_tag)
{
std::make_heap(begin, end, compFunc);
std::sort_heap(begin, end, compFunc);
}

template <typename It, typename Comp, typename IterCat>
void heapSort(It begin, It end, Comp compFunc, IterCat)
{
typedef typename It::value_type value_type;

std::vector<value_type> randomAccessContainer;
randomAccessContainer.reserve(std::distance(begin, end));
std::move(begin, end, std::back_inserter(randomAccessContainer));

heapSort(std::begin(randomAccessContainer), std::end(randomAccessContainer), compFunc, std::random_access_iterator_tag());
std::move(std::begin(randomAccessContainer), std::end(randomAccessContainer), begin);
}

首先从 [begin, end) move 到一个新容器,然后从那个容器 move 回 [begin, end) 是标准的 C++ 吗?

最佳答案

Is it standard C++ to first move from [begin, end) into a new container, and then move from that container back into [begin, end)?

我最初对您使用“标准”一词感到困惑,并编辑了问题,使其询问这是否“合法”。该问题的答案是:“是的这是完全合法的”。 move 原始范围内的元素后,它们仍处于有效(即使未指定)状态。

因此,对 std::move() 的第二次调用将仅对元素进行 move 赋值,并且这些元素的类型应具有不带前置条件的 move 赋值运算符。只要是这种情况,我认为就没有问题。

不过,在编辑你的问题后,我开始怀疑你是否真的想问这是否是“标准”,意思是“常见做法”,这就是我恢复原来措辞的原因。

这个问题的答案是“部分”。您通常会使用几个 move 迭代器 来初始化您的临时 vector ,而不是调用std::move:

std::vector<value_type> randomAccessContainer(
std::make_move_iterator(begin),
std::make_move_iterator(end)
);

除此之外,您的实现对我来说似乎是正确的。

关于c++ - 使用先前已 move 的输出迭代器调用 move() 是标准 C++ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312773/

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