2015-05-15 26 views
0

一個可能看起來微不足道的問題,但我想知道在將包含重複整數的數組轉換爲unordered_set之後,是否有辦法獲得唯一的整數計數。清楚的是,我從一些數組開始,變成了一個無序集,突然間,unordered_set只包含唯一整數,並且我簡單地在unordered_set中的整數的重複數之後。 這可能嗎? (類似unordered_set.count(指數)?)如何統計unordered_set中的唯一整數?

+0

假設我有陣列'[2,1,2,1,2]',我把它變成一組無序。你是問如何得到集合中的整數數目(即2),還是你想要得到每個整數出現的次數(所以2出現的次數是3)?第一件事很簡單,第二件事不是你使用unordered_set。 – user2357112

+2

那麼,是不是所有*值在一組「獨特」?這不是一個集合的定義要求之一,它只包含每個「關鍵」之一?您可能想要閱讀例如[這個'std :: unordered_set'參考](http://en.cppreference.com/w/cpp/container/unordered_set)。 –

+0

嗨,這是第二件事。我可以使用unordered_map完成第二件事嗎?) – Lexka

回答

0

可能出現瑣碎的問題,但我想知道是否有獲得整數計數的方式後,我變換含重複整數到一個數組,獨特unordered_set。

如果容器是連續的,就像一個數組,那麼我相信你可以用ptrdiff_t來做一些迭代器數學計算。不過,我不確定非連續的容器。

由於您使用數組開始:在陣列上

  1. 呼叫unique
  2. unique返回iter.end()
  3. 計算ptrdiff_t count使用iter.begin()iter.end()

請記住,在步驟3的計算需要針對sizeof和elem進行調整ENT。

但是爲了解釋Beta,一些容器適合這種情況,而另一些則不適合。如果您有無序集(或地圖或樹),則信息將不可用。

+0

但我該怎麼說呢?你有沒有一個例子實現?謝謝 – Lexka

+0

@Lexka - 我爲你增加了一些信息。 *「你有沒有一個示例實現?」 - 我希望你不是想讓我爲你實現這個:) – jww

+0

嗨,實際上,我沒有使用數組,但unordered_set所以我不用認爲你的例子是合適的 – Lexka

0

根據您對user2357112問題的回答,我會寫一個解決方案。 所以,讓我們假設,而不是unordered_set我們將使用一個載體,我們的矢量有這樣的價值觀:中出現了多少次特定值

{1, 1, 1, 3, 4, 1, 1, 4, 4, 5, 5}; 

所以,我們想要得到的數字(在不同的載體,我認爲)在向量中,對嗎?在這種情況下,結果是:1出現5次,3出現一次,4出現3次,5出現2次。

爲了得到這個工作,一個可能的解決方案可以是這樣的:

  1. 從源矢量獲取唯一項並將它們存儲在不同的載體,所以這個載體將包含:1,3,4, 5
  2. 遍歷整個獨特向量並從源向量中計數這些元素。
  3. 打印結果

從點1中的代碼,可以是這樣的:

template <typename Type> 
vector<Type> unique_entries (vector<Type> vec) { 
    for (auto iter = vec.begin(); iter != vec.end(); ++iter) { 
     auto f = find_if (iter+1, vec.end(), [&] (const Type& val) { 
      return *iter == val; 
     }); 

     if (f != vec.end()) { 
      vec.erase (remove (iter+1, vec.end(), *iter), vec.end()); 
     } 
    } 
    return vec; 
} 

從點2中的代碼,可以是這樣的:

template <typename Type> 
struct Properties { 
    Type key; 
    long int count; 
}; 

template <typename Type> 
vector<Properties<Type>> get_properties (const vector<Type>& vec) { 
    vector<Properties<Type>> ret {}; 
    auto unique_vec = unique_entries (vec); 
    for (const auto& uv : unique_vec) { 
     auto c = count (vec.begin(), vec.end(), uv); // (X) 
     ret.push_back ({uv, c}); 
    } 
    return ret; 
} 

當然,我們不需要Properties類來存儲鍵和計數值,你可以只返回一個int向量(帶有元素數),但正如我所說的,這是可能的解決方案之一。因此,通過使用unique_entries我們得到獨特的表項(:))的載體,那麼我們就可以在整個向量VEC迭代(get_properties,使用的std ::算標記爲(X)),以及性能的push_back反對向量ret

從3點的代碼,可能是這樣的:

template <typename Type> 
void show (const vector<Properties<Type>>& vec) { 
    for (const auto& v : vec) { 
     cout << v.key << " " << v.count << endl; 
    } 
} 

// usage below 
vector<int> vec {1, 1, 1, 3, 4, 1, 1, 4, 4, 5, 5}; 
auto properties = get_properties (vec); 
show (properties); 

而結果是這樣的:

1 5 
3 1 
4 3 
5 2 

什麼是值得大家注意,這個例子已經使用模板來寫提供選擇向量中元素類型的靈活性。如果你想存儲的不是int類型的長,很長很長,短等價值觀,所有你需要做的是改變源向量的定義,例如:

vector<unsigned long long> vec2 {1, 3, 2, 3, 4, 4, 4, 4, 3, 3, 2, 3, 1, 7, 2, 2, 2, 1, 6, 5}; 
show (get_properties (vec2)); 

會產生:

1 3 
3 5 
2 5 
4 4 
7 1 
6 1 
5 1 

這是期望的結果。

還有一點需要注意,你也可以用字符串矢量來做到這一點。

vector<string> vec_str {"Thomas", "Rick", "Martin", "Martin", "Carol", "Thomas", "Martin", "Josh", "Jacob", "Jacob", "Rick"}; 
show (get_properties (vec_str)); 

而結果是:

Thomas 2 
Rick 2 
Martin 3 
Carol 1 
Josh 1 
Jacob 2 
+0

你好,這是一個非常好的和複雜的答案,但我實際上是在使用unordered_map之後,因爲人們早先已經明確說它使用unordered_set是無用的。你知道如何使用unordered_map完全不用從頭開始編寫代碼?至多應該三線操作,不是嗎? – Lexka

+0

我很抱歉,但現在我沒有任何其他解決方案,特別是使用unordered_map的解決方案。 –