Sorting 插入排序的模板化版本存在问题
下面是插入排序的模板化版本,它会导致编译错误,从而在没有任何额外空间的情况下就地执行插入排序Sorting 插入排序的模板化版本存在问题,sorting,c++11,move-semantics,Sorting,C++11,Move Semantics,下面是插入排序的模板化版本,它会导致编译错误,从而在没有任何额外空间的情况下就地执行插入排序 #include <vector> #include <iostream> #include <algorithm> #include <iterator> using namespace std; template <typename T> insertSort(T start, T end) { typename std::ve
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
template <typename T>
insertSort(T start, T end)
{
typename std::vector<typename std::iterator_traits<T>::value_type> TmpVec;
TmpVec tmp(std::make_move_iterator(start), std::make_move_iterator(end));
TmpVec::iterator begin = std::begin(tmp);
TmpVec::iterator end = std::end(tmp);
for(TmpVec::iterator i = begin; i != end; i++)
{
typename std::iterator_traits<T>::value_type value = *i;
TmpVec::iterator pos = i;
while (pos > start && *(pos-1) > value)
{
*pos = std::move(*(pos-1));
--pos;
}
*pos = value;
}
}
int main(int argc, char** argv) {
std::vector<double> arr = {1,5,3,2,6,3,9,8};
insertSort<double>(arr.begin(), arr.end());
for(int i=0; i<arr.size(); i++)
{
std::cout << arr[i] << " ";
}
return 0;
}
这会产生以下错误
main.cpp: In function 'int insertSort(T, T)':
main.cpp:21:12: error: expected ';' before 'tmp'
TmpVec tmp(std::make_move_iterator(start), std::make_move_iterator(end));
^
main.cpp:22:5: error: 'TmpVec' is not a class, namespace, or enumeration
TmpVec::iterator begin = std::begin(tmp);
^
main.cpp:23:5: error: 'TmpVec' is not a class, namespace, or enumeration
TmpVec::iterator end = std::end(tmp);
^
main.cpp:24:9: error: 'TmpVec' is not a class, namespace, or enumeration
for(TmpVec::iterator i = begin; i != end; i++)
^
main.cpp:24:37: error: 'i' was not declared in this scope
for(TmpVec::iterator i = begin; i != end; i++)
^
main.cpp:27:9: error: 'TmpVec' is not a class, namespace, or enumeration
TmpVec::iterator pos = i;
^
main.cpp:28:16: error: 'pos' was not declared in this scope
while (pos > start && *(pos-1) > value)
^
main.cpp:33:10: error: 'pos' was not declared in this scope
*pos = value;
^
main.cpp: In function 'int main(int, char**)':
main.cpp:40:46: error: no matching function for call to 'insertSort(std::vector<double>::iterator, std::vector<double>::iterator)'
insertSort<double>(arr.begin(), arr.end());
^
main.cpp:40:46: note: candidate is:
main.cpp:18:1: note: template<class T> int insertSort(T, T)
insertSort(T start, T end)
^
main.cpp:18:1: note: template argument deduction/substitution failed:
main.cpp:40:46: note: cannot convert 'arr.std::vector<_Tp, _Alloc>::begin<double, std::allocator<double> >()' (type 'std::vector<double>::iterator {aka __gnu_cxx::__normal_iterator<double*, std::vector<double> >}') to type 'double'
insertSort<double>(arr.begin(), arr.end());
main.cpp:在函数“int insertSort(T,T)”中:
main.cpp:21:12:错误:应为“;”在“tmp”之前
TmpVec-tmp(std::make_-move_迭代器(开始),std::make_-move_迭代器(结束));
^
main.cpp:22:5:错误:“TmpVec”不是类、命名空间或枚举
TmpVec::迭代器begin=std::begin(tmp);
^
main.cpp:23:5:错误:“TmpVec”不是类、命名空间或枚举
TmpVec::迭代器end=std::end(tmp);
^
main.cpp:24:9:错误:“TmpVec”不是类、命名空间或枚举
for(TmpVec::迭代器i=begin;i!=end;i++)
^
main.cpp:24:37:错误:“i”未在此范围内声明
for(TmpVec::迭代器i=begin;i!=end;i++)
^
main.cpp:27:9:错误:“TmpVec”不是类、命名空间或枚举
TmpVec::迭代器pos=i;
^
main.cpp:28:16:错误:“pos”未在此范围内声明
而(位置>开始和*(位置-1)>值)
^
main.cpp:33:10:错误:“pos”未在此范围内声明
*pos=值;
^
main.cpp:在函数“int main(int,char**)”中:
main.cpp:40:46:错误:调用“insertSort(std::vector::iterator,std::vector::iterator)”时没有匹配的函数
insertSort(arr.begin(),arr.end());
^
main.cpp:40:46:注:候选人为:
main.cpp:18:1:注意:模板int insertSort(T,T)
插入排序(T开始,T结束)
^
main.cpp:18:1:注意:模板参数扣除/替换失败:
main.cpp:40:46:注意:无法将'arr.std::vector::begin()'(类型'std::vector::迭代器{aka _ugnu_cxx::_normal_iterator}')转换为类型'double'
insertSort(arr.begin(),arr.end());
请帮助解决上述问题
typename std::vector<typename std::iterator_traits<T>::value_type> TmpVec;
我也建议
using tmp_iterator = typename TmpVec::iterator;
使用
tmp_迭代器
作为类型,而不是TmpVec::迭代器
TmpVec
被声明为变量。您是否忘记了typedef
?一旦这个问题得到解决,无论你在哪里,都可以使用TmpVec::iterator
,使之成为typename TmpVec::iterator
(或者添加另一个typedef)。insertSort
接受两个double
类型的参数,而不是vector::iterator
@igortandtnik或者,你知道,auto
:)这样的typename
是多余的,但允许的(当然,后来的使用表明它可能不是有意的)。typename std::template vector
FTW:)
typedef std::vector<typename std::iterator_traits<T>::value_type> TmpVec;
using tmp_iterator = typename TmpVec::iterator;