2015-03-31 20 views
0

(不確定這是否是正確的任務) 我正在寫一個與經典排序相關的stl風格的算法。 原型爲:如何使用end()迭代器擴展範圍

template<typename RAIter> 
    void Algo(RAIter first, RAIter last) { 
    .... 
    size_t size = std::distance(first, last); 
    RAIter midIter =first; 
    std::advance(midIter, size/2 - 1); 

    Algo(first, midIter); 
    Algo(midIter + 1, last); 
    .... 
} 

,但它不正確的我,因爲,最初 它得到的範圍內工作一樣: 矢量V; Algo(v.begin(),v.end());然而,在內部,在遞歸調用中,子範圍不包含end()元素。

這種情況下的典型技術是什麼?

+0

你是算法內部不一致。你在被排除的末尾調用它,但是你可以遞歸地調用它,並且結尾被包含和排除。 – chris 2015-03-31 17:31:28

+0

實際上問題是 - 如何爲內部呼叫添加end()元素 – amigo421 2015-03-31 17:36:09

+1

如果內部呼叫的合約比用戶呼叫的合約不同,則需要不同的功能。 – chris 2015-03-31 17:40:29

回答

0

我會提出兩個選擇。

  1. (首選)使算法在內部不需要包含last。你的情況是可以做到這樣的:

    template<typename RAIter> 
    void Algo(RAIter first, RAIter last) { 
        .... 
        size_t size = std::distance(first, last); 
        if (size <= 1) { 
         // special processing of single-item or empty range 
         return; 
        } 
    
        RAIter midIter =first; 
    
        std::advance(midIter, size/2); 
    
        Algo(first, midIter); // midIter not included 
        Algo(midIter, last); // it's included here instead 
    } 
    
  2. 讓包括一個獨立的功能,期待與last範圍:

    template<typename RAIter> 
    void AlgoImpl(RAIter first, RAIter last) { 
        .... 
        // looks like this is more correct: 
        // size_t size = std::distance(first, last) + 1; 
        size_t size = std::distance(first, last); 
        RAIter midIter =first; 
        std::advance(midIter, size/2 - 1); // and here "- 1" seems wrong 
    
        AlgoImpl(first, midIter); 
        AlgoImpl(midIter + 1, last); 
        .... 
    } 
    
    template<typename RAIter> 
    void Algo(RAIter first, RAIter last) { 
        if (first == last) { 
         return; 
        } 
        AlgoImpl(first, last - 1); 
    } 
    
+0

E.g.容器有6個元素。使用end()進行初始調用時,距離返回6,但在下一步中,返回2而不是預期的3,這很明顯,因爲初始調用包含帶有結束的7個元素,但下一次調用僅獲得3個元素而沒有結束。 – amigo421 2015-03-31 18:13:25

+0

@ amigo421注意'std :: advance(midIter,size/2);'not'size/2 - 1'。順便說一下'size/2 - 1'在兩種情況下都是錯誤的,我只是沒有編輯第二個。 – 2015-03-31 18:16:23

+0

@ amigo421但可能你不會將範圍劃分成相等的部分,誰知道 – 2015-03-31 18:19:54