![](/img/trans.png)
[英]What is the difference between std::vector<int> and std::vector<int>*?
[英]What is the difference between std::set and std::vector?
我現在正在學習 STL。 我閱讀了有關set
容器的信息。 我有疑問,什么時候要使用set
? 閱讀set 的描述后,它看起來沒有用,因為我們可以用vector
代替它。 你能說一下vector
和set
容器的優缺點嗎? 謝謝
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.