Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 插入排序的模板化版本存在问题_Sorting_C++11_Move Semantics - Fatal编程技术网

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;