gpt4 book ai didi

c++ vector 迭代器到函数模板

转载 作者:行者123 更新时间:2023-11-30 02:56:22 24 4
gpt4 key购买 nike

我是 STL 新手。我正在尝试编写一个将 vector 迭代器作为参数的例程。即,我需要传递 vector.begin() 和 vector.end()。无法理解为什么我的代码不起作用:

template<typename T, typename Iter> void VectorQuickSort(Iter itL, Iter itR){
const int nSize = (itR - itL);
if(nSize<2) return;
Iter iBeginning(itL), iEnd(itR);
--itR;
T tPivot = *( itL + (nSize/2) );
while( itL <= itR ){
while( *itL < tPivot ) ++itL;
while( *itR > tPivot ) --itR;
if( itL <= itR ){
std::iter_swap(itL,itR);
++itL;
--itR;
}
}
VectorQuickSort(iBeginning,itR);
VectorQuickSort(itL,iEnd);
}

main() 中,我只需调用 VectorQuickSort(vInput.begin(),vInput.end());。编译器告诉我错误:函数模板“VectorQuickSort”的实例与参数列表不匹配。任何帮助表示赞赏:)

编辑:作为对可能尝试使用上述代码的人的警告:即使您应用提供的答案,排序算法本身仍然存在问题。我无法将正常工作的 C 版本翻译成 STL 风格。

最佳答案

它无法从这些参数中推导出模板参数 T。事实上,您甚至不需要 T。它是多余的,因为您可以从 Iter 计算出 T 的类型 - 毕竟,迭代器迭代类型为 T 的元素。将其更改为:

template<typename Iter>

然后,如果您使用的是 C++11,则可以更改使用 T 的行来自动推断 tPivot 的类型:

auto tPivot = *( itL + (nSize/2) );

如果您不支持 C++11,您可以使用 std::iterator_traits确定合适的类型:

typename std::iterator_traits<Iter>::value_type tPivot = *( itL + (nSize/2) );

你也许可以用 typedef 来简化它:

typedef typename std::iterator_traits<Iter>::value_type value_type;
value_type tPivot = *( itL + (nSize/2) );

关于c++ vector 迭代器到函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591206/

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