我是的新手,但我有足夠的知識從過去了解泛型的概念;多年來,我一直是一名Python開發人員。C++瞭解模板的語法,輸入名稱
我通過示例學習了c++
,我發現這個代碼的泛型實現爲merge sort
。
template<typename I>
void doMerge(I begin, I midPoint, I end)
{
typename std::vector<typename std::iterator_traits<I>::value_type> TmpVec;
TmpVec tmp(std::make_move_iterator(begin), std::make_move_iterator(end));
TmpVec::iterator beginAlt = std::begin(tmp);
TmpVec::iterator endAlt = std::end(tmp);
TmpVec::iterator midAlt = std::next(beginAlt, std::distance(begin, midPoint));
TmpVec::iterator l = beginAlt
TmpVec::iterator r = midAlt;
I i = begin;
while(l < midAlt && r < endAlt)
{
*i = std::move((*l < *r) ? *l++ : *r++);
++i;
}
while(l < midAlt)
{ *i = std::move(*l++);
++i;
}
while(r < endAlt)
{ *i = std::move(*r++);
++i;
}
}
template<typename I>
void mergeSort(I begin, I end)
{
std::size_t length = std::distance(begin, end);
if (length <= 1)
{ return;
}
std::size_t mid = length/2;
I midPoint = std::next(begin, mid);
mergeSort(begin, midPoint);
mergeSort(midPoint, end);
doMerge(begin, midPoint, end);
}
我使用g++
從Makefile
編譯使用下面的命令
g++ -std=c++98 merge_sort.cpp -o mergesort.out
merge_sort.cpp:34:11: error: expected ';' after expression
TmpVec tmp(std::make_move_iterator(begin), std::make_move_iterator(end));
有人可以解釋的編譯錯誤,並提供一些洞察到以下幾個部分:
template<typename I>
void doMerge(I begin, I midPoint, I end)
的template
關鍵字允許函數接受通用迭代器,是否正確?但是爲什麼我不能在頭文件中定義一個全局的template
以用於此代碼文件中的所有函數?
你應該至少用'-std = C++ 11'進行編譯。 –
我認爲你的意思是在'typename std :: vector :: value_type> TmpVec;' –
NathanOliver
中使用'typedef'而不是'typename'。C++沒有泛型。在編寫C++時不要用Java來思考。 –