簡體   English   中英

std::set 和 std::vector 有什么區別?

[英]What is the difference between std::set and std::vector?

我現在正在學習 STL。 我閱讀了有關set容器的信息。 我有疑問,什么時候要使用set 閱讀set 的描述后,它看起來沒有用,因為我們可以用vector代替它。 你能說一下vectorset容器的優缺點嗎? 謝謝

set 根據您提供的函子,它保證保持特定順序。 無論您添加或刪除什么元素(除非您添加重復項,這在set是不允許的),它始終會被排序。

vector完全且具有您明確給出的順序。 vector中的項目是您放置它們的位置。 如果你把它們弄亂了,那么它們就亂了; 您現在需要sort容器進行sort以將它們放回原處。

誠然, set用途相對有限。 通過適當的紀律,人們可以將項目插入vector並保持有序。 但是,如果您不斷地從容器中插入和刪除項目, vector會遇到很多問題。 它將執行大量元素的復制/移動等操作,因為它實際上只是一個數組。

將項插入vector所需的時間與vector已有的項數成正比。 將項目插入到set所需的時間與項目數量的log₂成正比。 如果項目的數量很大,那就是一個巨大的差異。 log₂(100,000) 是 ~16; 這是一個重大的速度改進。 移除也是如此。

但是,如果您在初始化時一次完成所有插入,則沒有問題。 您可以將所有內容插入vector ,對其進行排序(支付一次該價格),然后使用排序vectors標准算法來查找元素並迭代排序列表。 雖然迭代通過的元素set是不完全慢,遍歷一個vector更快。

因此,在某些情況下,已排序的vector擊敗set 話雖如此,除非您知道這是必要的,否則您真的不應該為這種優化的費用而煩惱。 因此,使用set ,除非你有什么系統的經驗,你寫(並因此知道你需要的性能)還是有譜的手,告訴你的數據,你需要一個vector ,而不是一set

它們是不同的東西:你決定向量的排序方式,你也可以根據需要將盡可能多的相等的東西放入向量中。 集合按照集合的內部規則進行排序(您可以設置規則,但是集合會處理排序),並且您不能將多個相等的項目放入一個集合中。

當然,您可以維護一個唯一項的向量,但是當您執行面向集合的操作時,您的性能會受到很大影響。 例如,假設您有一組 10000 個項目和一個包含 10000 個不同無序項目的向量。 現在假設您需要檢查值 X 是否在集合中的值中(或向量中的值中)。 當 X 不在項目中時,搜索向量會慢 100 倍。 在計算集合並集和交集時,您會看到類似的性能差異。

總而言之,集合和向量有不同的目的。 您可以使用向量而不是集合,但這需要更多的工作,並且可能會嚴重損害性能。

表單cluplus.com集:

集合是按照特定順序存儲唯一元素的容器。

所以集合是有序的,並且項目是唯一表示的

而向量:

向量是表示可以改變大小的數組的序列容器。

所以向量按照你填寫的順序,並且可以容納多個相同的項目

喜歡套裝:

  • 如果您希望過濾多個相同的值
  • 如果您希望以指定的順序解析項目(在向量中執行此操作需要專門對向量進行排序)。

更喜歡向量:

  • 如果你想保持相同的值
  • 如果您希望以與推送它們相同的順序解析項目(假設您不處理向量順序)

簡單的區別是 set 只能包含唯一值,並且是有序的。 因此,您可以在每次插入/刪除后需要對值進行連續排序的情況下使用它。

set<int> a;
vector<int> b;
for (int i = 0; i < 10; ++i)
{
    int val = rand() % 10;
    a.insert(val);
    b.push_back(val);
}
cout << "--SET---\n"; for (auto i : a) cout << i << ","; cout << endl;
cout << "--VEC---\n"; for (auto j : b) cout << j << ","; cout << endl;

輸出是

--SET---
0,1,2,4,7,8,9,
--VEC---
1,7,4,0,9,4,8,8,2,4,

針對集合搜索項目比向量更快(O(log(n))vs O(n))。 要針對向量搜索項目,您需要迭代向量中的所有項目,但該集合使用紅黑樹來優化搜索,只會查找少數項目以找到匹配項。

集合是有序的,這意味着你只能從最小的一個到最大的一個按順序迭代它,或者相反的順序。

但是向量是無序的,您可以按插入順序移動它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM