[英]c++ understanding the syntax of templates, typename
I am new to c++
but I have enough Java
knowledge from the past to understand the concept of generics; 我是
c++
新手,但是我过去有足够的Java
知识,可以理解泛型的概念。 I have been a python dev for many years now. 我从事Python开发已经很多年了。
I am learning c++
by examples and I came across this code for a generics implementation of merge sort
. 我正在通过示例学习
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);
}
I am using g++
to compile from a Makefile
with the following command 我正在使用
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));
Can someone explain the compile error and provide some insight into the following parts: 有人可以解释编译错误并提供一些有关以下部分的见解:
template<typename I>
void doMerge(I begin, I midPoint, I end)
The template
keyword allows the function to accept a generic Iterator, correct? template
关键字允许函数接受通用的迭代器,对吗? But why can I not define one global template
in a header file to use in all functions in this code file? 但是,为什么不能在头文件中定义一个全局
template
以在此代码文件的所有函数中使用?
在C ++ 11中添加了std::make_move_iterator()
,因此您无法使用-std=c++98
编译
Thanks to @NathanOliver for his comment. 感谢@NathanOliver的评论。 The below compiles and executes correctly:
下面的代码可以正确编译并执行:
template<typename I>
void doMerge(I begin, I midPoint, I end)
{
typedef std::vector<typename std::iterator_traits<I>::value_type> TmpVec;
TmpVec tmp(std::make_move_iterator(begin), std::make_move_iterator(end));
typename TmpVec::iterator beginAlt = std::begin(tmp);
typename TmpVec::iterator endAlt = std::end(tmp);
typename TmpVec::iterator midAlt = std::next(beginAlt, std::distance(begin, midPoint));
typename TmpVec::iterator l = beginAlt;
typename 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);
}
int main()
{
std::vector<int> data {{ 5,12,45,2,67,8}};
mergeSort(std::begin(data), std::end(data));
std::copy(std::begin(data), std::end(data), std::ostream_iterator<int>(std::cout, ", "));
std::cout << "\n";
}
Thanks to @TriskalJM for the c++11
tip! 感谢@TriskalJM的
c++11
技巧!
$ make
rm -rf *.out
g++ -std=c++11 merge_sort.cpp -o mergesort.out
./mergesort.out
2, 5, 8, 12, 45, 67,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.