2014-02-25 79 views
1

我研究的基本排序算法,我一直在尋找關於殼牌排序這裏: https://github.com/nicolausYes/iterator-template-sort-library/blob/master/src/ShellSort.h減法迭代器和整數

下面是相關代碼:

template< class RandomAccessIterator, class Compare > 
static void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp) 
{ 
    auto size = last - first; 
    auto h = 1; 
    while(h < size/3) h = 3 * h + 1; 

    while(h >= 1) 
    { 
     for(auto i = first + h; i != last; i++) 
     { 
      for(auto j = i; (j - first) >= h && comp(*j, *(j-h)); j -= h) 
       std::swap(*j, *(j-h)); 
     } 

     h /= 3; 
    } 
} 

當他宣稱大小,則它應該是一個整數值或另一個迭代器?因爲他將數字除以後的數字就是這樣的:「size/3」 但是當他調用std :: swap(* j,*(j -h));他交換了2個迭代器的內部,所以j-h返回一個迭代器。如果「大小」是一個迭代器,那麼對它做什麼/做什麼?我的意思是,如果它將內部指針拆分爲3,那就沒有意義了。

回答

2

減去來自另一個迭代器應該產生一個整數。 STL的隨機訪問迭代器在減去時產生類型爲ptrdiff_t的值。通常在實現迭代器時使用這種類型是很好的做法。但是,在實踐中,如果你想使用,比如說int,那通常也很好。

減去來自迭代器的整數會生成另一個迭代器。

+1

更精確地說:減法迭代器的結果必須是有符號整型。如果你使用的是標準分配器,它總是會是'ptrdiff_t'。然而,你可以定義你自己的分配器,用它們實例化容器,然後改變它。 (如果你改變它也不是一個有符號的整數類型,那麼你有未定義的行爲。) –

+0

但是他使用std :: swap(* j,*(j-h))的行怎麼辦? ? 在這裏,他解引用迭代器減法的結果。 –

+0

@shortage_radeon'h'類型爲'int' – Brian