[英]How does std::sort implement the swap operation using iterators only?
我該如何實現以下內容
template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
...
}
因此Swap(a,b)交換a和b指向的值。 換句話說:如何在不知道數據類型的情況下創建第三個變量?
iter_swap
就是為了那份工作:
std::iter_swap(a, b);
此外,如果您可以使用c ++ 11,您可以使用decltype
:
std::remove_reference<decltype(*a)>::type c = *a;
*a = *b;
*b = c;
如何在不知道數據類型的情況下創建第三個變量?
使用std::iterator_traits<ITERATOR>::value_type
在C ++ 11中,類型是std::remove_reference<decltype(*a)>::type
,但是為了聲明變量,你可以使用auto
。
在C ++ 03中,推斷任意表達式類型的最可靠方法是通過另一個模板:
// NOTE: This is for illustration only. If you are simply swapping
// values, use 'std::swap' instead of this, since that is specialised
// for many types to avoid unnecessary copy-assignment.
template <typename T> void value_swap(T & a, T & b) {
T t = a;
a = b;
b = t;
}
template <typename I> void iterator_swap(I a, I b) {
value_swap(*a, *b);
}
或者,對於行為良好的迭代器(包括指針和標准迭代器),該類型可用作std::iterator_traits<ITERATOR>::value_type
。 如果有人編寫了自己的迭代器類型而沒有提供默認iterator_traits
所需的嵌套類型或者為它專門設置iterator_traits
,那么這將不起作用。
一些編譯器提供類似於decltype
的非標准擴展; 例如GCC提供typeof
。 如果你不需要你的代碼可移植,你可以使用這樣的東西。
順便說一下,你的特定函數已經存在為std::iter_swap
。
template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
using std::swap;
swap(*a,*b);
}
迭代器有一個所謂的特性,用於定義它的值類型。
iterator_traits<ITERATOR>::value_type temp = *a;
*a = *b;
*b = temp;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.