如何复制只有两个迭代器的数据?
How to copy data having only two iterators?
我正在创建一个合并排序算法,该算法的一个步骤涉及创建子数组,这些子数组是执行排序的序列的一部分。作为输入,我在容器的开头和结尾获取迭代器,然后在开始和结束之间找到一个中间迭代器,然后需要根据收到的迭代器复制数据。
template<class Iterator>
void merge_sort(Iterator t_begin, Iterator t_end)
{
// Recursion ends when the sequence becomes 1
if(std::distance(t_begin, t_end) < 2) {
return;
}
// Combining two sorted sequences
auto merge = [](Iterator begin, Iterator middle, Iterator end) {
// Supposed, subarrays are sorted
const std::deque<std::remove_reference_t<decltype(*begin)>> left {begin, middle}, right {middle, end};
auto left_it = left.begin(), right_it = right.begin();
// Merge two subarrays into one sorted
for(Iterator itr = begin; itr != end; ++itr) {
if(left_it == left.end()) {
*itr = *right_it++;
} else if(right_it == right.end()) {
*itr = *left_it++;
} else if(*left_it <= *right_it) {
*itr = *left_it++;
} else {
*itr = *right_it++;
}
}
};
Iterator middle = t_begin + static_cast<std::size_t>((std::distance(t_begin, t_end) / 2));
merge_sort(t_begin, middle);
merge_sort(middle, t_end);
merge(t_begin, middle, t_end);
}
作为解决方案,我使用队列数据结构的显式声明。
const std::deque<std::remove_reference_t<decltype(*begin)>> left {begin, middle}, right {middle, end};
如何让两个迭代器将数据复制到另一个变量而不绑定到特定容器,并使用这些迭代器所属的容器?有没有更优雅的方法可以做到这一点?
你正在寻找的不仅仅是一件C++的事情,而是一个算法的东西。以默认(也是最快(方式实现的合并排序需要额外的临时内存。
有一些方法可以避免这种情况,称为就地合并排序或简单的就地合并。不过,这非常不平凡,四处搜索,您会发现多种算法来执行此操作。
相关文章:
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 如果我的容器位于两个现有值之间,那么伪造迭代器类别是否合理
- 如何复制只有两个迭代器的数据?
- 如何以链式方式在两个容器上构建迭代器
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- 设计具有两个指向嵌套对象的指针的迭代器
- 声明一个模板函数,该函数接收两个泛型迭代器作为参数
- C++从两个迭代器创建列表对
- 在两个层迭代器中超载 产生奇怪的错误
- 如何在C++中比较两个非随机访问迭代器
- 如何定义模板函数,该功能在C 中占用两个迭代器
- 指向同一项的两个映射迭代器是否保证相等
- 迭代两个向量比boost_foreach迭代器更快
- 是同一集合上的两个不同的迭代器
- 如何获取两个迭代器之间的元素总数
- 使用STL迭代器的两个循环
- 给定同一数据结构的两个迭代器,如何检查哪个迭代器在另一个之前
- 如何在VS2013上比较两个迭代器进行单元测试
- <algorithm>在同一输入迭代器范围内并排运行两个
- C++矢量迭代器:比较和擦除两个元素