2013-05-30 65 views
2

新排序向量到目前爲止,我有這樣的功能:創建無重複

std::vector<int> f(std::vector& v) 
{ 
    std::vector<int> result; 
    for(unsigned x = 0; x < v.size(); x++) 
    { 
     std::vector<int>::iterator location = std::find(result.begin(),result.end(),v[x]); 
     if(location == result.end()) 
     { 
      result.push_back(this->v[x]); 
     } 
    } 
    std::sort(result.begin(),result.end()); 
    return result; 
} 

該函數返回從V元素沒有重複的排序向量。

是否有更緊湊的書寫方式?我讀過關於std :: unique的內容,但這涉及編輯我無法做到的向量。

+0

不能你只需要通過'價值和'的std :: sort'和v' 'std :: unique'呢? – chris

回答

6

既然你反正複製載體,只是副本,然後對其進行排序和獨特的結果:

std::vector<int> f(std::vector<int> v) { 
    using std::begin; 
    using std::end; 

    std::sort(begin(v), end(v)); 
    v.erase(std::unique(begin(v), end(v)), end(v)); 
    return v; 
} 
+0

不要忘記,通過價值打開移動以及。像這樣的函數更有意義,不需要傳入一個左值。 – chris

+0

@chris:是的,對於像這樣的情況,在複製/移動項目中進行修改,然後將其返回,特別有效。 –

+0

我當然認爲在價值中服用矢量並沒有什麼壞處。當然,在這種情況下傳遞非const引用是沒有意義的。這個實現是O(N)+ O(n * log(N)),其中原始似乎是O(N!)+ O(n * log(N))。 –

3

我已閱讀關於std :: unique,但這涉及編輯我不能做的向量。

先製作一份!然後按通常的方式使用unique/erase。在C++ 03你可以這樣寫:

std::vector<int> f(const std::vector<int>& v) 
//     ^^^^^ you won't modify v, so make it obvious! 
{ 
    std::vector<int> result(v); // copy the vector 
    std::sort(result.begin(),result.end()); // sort it first so that std::unique can work 
    std::erase(std::unique(result.begin(),result.end()), result.end()); // just keep the unique elements 
    return result; 
} 

如果使用C++ 11,那麼你可以利用移動語義的優勢和傳遞按值參數(這是更有效的,當你傳遞一個右值到您的功能也一樣可以高效的爲左值),這也可以讓你直接修改參數:

std::vector<int> f(std::vector<int> v) 
//     ^^^^^^^^^^^^^^^^ pass by value 
{ 
    std::sort(v.begin(),v.end()); // sort it first so that std::unique can work 
    std::erase(std::unique(v.begin(),v.end()), v.end()); // just keep the unique elements 
    return v; 
} 

感謝@DavidBrown和@克里斯,我傾向於因爲我沒有忽視這個C++ 11成語習慣了。

+0

既然你立即製作了一個矢量的副本,你應該通過值傳遞矢量。這在某些情況下允許[某些優化](http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/)。 –

+0

@DavidBrown:對,我經常忘記這個。有趣的是,我看到克里對傑瑞的回答做出了同樣的評論。修復它,謝謝... – syam

+0

這是更多的情況下,允許東西被移動到參數。無需將參數移動到'result'中,只需按原樣使用它,因爲它不是原始矢量。 – chris