2016-03-27 53 views
2

我一直在編碼圖算法,我想出了這個問題。在C++ 11 我試圖創建一個結構如下圖所示,C++函數重載「常量」

struct edges{ 
    int u , v , w ; 
    edges(){} 
    edges(int _u , int _v , int _w) { 
    u = _u , v = _v , w = _w ; 
    } 
    bool operator < (edges & r) { 
    return w < r.w ; 
    } 
}; 

所以,我寫了這個代碼,它編譯成功。 但是,當我打電話的std ::排序()功能類似下面,

sort(arr , arr + M) ; // here arr is an array of edges with M elements 

然後我得到一個指向stl_algo.h行數編譯錯誤。我從stl_algo.h中添加部分代碼,

/// This is a helper function... 
    template<typename _RandomAccessIterator, typename _Tp> 
    _RandomAccessIterator 
    __unguarded_partition(_RandomAccessIterator __first, 
       _RandomAccessIterator __last, const _Tp& __pivot) 
    { 
     while (true) 
    { 
     while (*__first < __pivot) // 2242 number line 
     ++__first; 
     --__last; 
     while (__pivot < *__last) 
     --__last; 
     if (!(__first < __last)) 
     return __first; 
     std::iter_swap(__first, __last); 
     ++__first; 
    } 
    } 

那麼,我在互聯網上找到解決方案,並得到一個。我有常量關鍵詞中包含重載運營商,

struct edges{ 
    int u , v , w ; 
    edges(){} 
    edges(int _u , int _v , int _w) { 
    u = _u , v = _v , w = _w ; 
    } 
    bool operator < (const edges & r) const { 
    return w < r.w ; 
    } 
}; 

我的問題是,爲什麼我有「常量」關鍵字重載運營商,如果我打電話的std :: sort()函數?

+0

@SamVarshavchik我在標準中找不到任何這樣的要求。最接近它是'假設comp不會通過解引用迭代器應用任何非常量函數。'它看起來像一個實現缺陷,'__ pivot'被設置爲'const'。 –

+0

什麼編譯器/操作系統?另外,'arr'是什麼?請提供[mcve]。 – Barry

+0

編譯g ++ 11和OS是debian linux(ubuntu) –

回答

2

操作<用於比較兩個對象,並且由參數傳遞的對象將不會改變,所以參數必須是常量