簡體   English   中英

std :: sort如何僅使用迭代器實現交換操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM