【发布时间】:2015-06-05 03:35:52
【问题描述】:
(不确定这是正确的任务) 我正在编写与经典排序相关的 stl 风格的算法。 原型是:
template<typename RAIter>
void Algo(RAIter first, RAIter last) {
....
size_t size = std::distance(first, last);
RAIter midIter =first;
std::advance(midIter, size / 2 - 1);
Algo(first, midIter);
Algo(midIter + 1, last);
....
}
但它对我来说不能正常工作,因为, 最初它的范围如下: 向量 v; 算法(v.begin(),v.end()); 但是,在内部,在递归调用中,子范围不包含 end() 元素。
在这种情况下,典型的技术是什么?
【问题讨论】:
-
您的算法不一致。您调用它时排除了结尾,但您递归地调用了结尾同时包含和排除了它。
-
其实问题是 - 如何为内部调用添加 end() 元素
-
如果内部调用的合约与用户调用的合约不同,则需要不同的函数。
-
问题:为什么递归调用需要
end()元素?我想不出任何需要这些信息的经典排序算法。 -
传递结束元素是 stl 中的常见做法,所有算法都使用范围 [first, last)
标签: c++ stl iterator stl-algorithm