在下面的代码中,我使用 auto 定义了一个与所使用的迭代器兼容的新变量“temp”。我只是好奇我是否可以在不使用 auto 关键字的情况下做同样的事情??
换句话说,我不知道容器是什么。那么如何在不破坏代码通用性的情况下定义临时变量。
作为 C++ 的新手,我一直使用 SO 作为解决任何问题的网站。我一直在寻找类似的问题,但没有找到任何问题。任何帮助将不胜感激!!
/* InsertionSort.c */
#include<iostream>
#include <typeinfo>
namespace sort {
template <class RandomAccessIterator, class Compare >
void InsertionSort(RandomAccessIterator begin, RandomAccessIterator end, Compare comp) {
RandomAccessIterator itrOuter,itrInner,itrShift;
for(itrOuter = begin+1; itrOuter!=(end); itrOuter++) {
// ***************HERE***********************************************
auto temp= *itrOuter;
for(itrInner=begin;itrInner<itrOuter;itrInner++) {
if(!comp(*itrInner,*itrOuter)) {
for(itrShift=itrOuter;itrShift> itrInner;itrShift--)
*itrShift=*(itrShift -1);
*itrInner=temp;
break;
}
}
}
}
}
bool Compa(int& x, int& y) {return (x<y);}
int main(void) {
using namespace sort;
int arr[] = {3,5,1,7,2,6,9,12};
InsertionSort(arr, arr+8, Compa );
for(int i=0;i < 8;i++)
std::cout<<arr[i]<<" ";
return 0;
}
最佳答案
使用 auto
是使用 C++11 的最简单方法。您也可以使用 decltype()
,当然:
decltype(*itrOuter) tmp = *iterOuter;
这将作为您使用 auto
的方法, 复制值。如果你真的想获得你会使用的引用
decltype((*itrOuter)) tmp = *iterOuter;
大致相当于:
auto& tmp = *iterOuter;
假设你需要使用C++03,没有办法推导出这个位置的变量类型。推断变量类型的唯一方法是委托(delegate)给函数模板。正常的 C++03 方法是获取 value_type
来自 std::iterator_traits<...>
:
typename std::iterator_traits<RandomAccessIterator>::value_type tmp = *iterOuter;
...或者,对引用做同样的事情:
typename std::iterator_traits<RandomAccessIterator>::reference tmp = *iterOuter;
关于c++ - 在不使用 auto 的情况下从模板中的迭代器推断出变量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20452979/