STL庫中的集合set簡介(C++,Java)
阿新 • • 發佈:2018-12-19
1.簡介:
集合是數學中的一個概念,通俗地理解,集合是由一些不重複的資料組成的。比如{1,2,3}就是一個有1,2,3三個元素的集合。C++和Jav的標準庫中的集合支援高效的插入、刪除和查詢操作,這3個操作的時間複雜度都是O(lgn),其中n是當前集合中元素的個數。如果用陣列,雖然插入的時間複雜度為O(1),但是刪除和查詢的時間複雜度為O(n),效率太低。 C++中我們常用的集合是set,在Java中常用的集合是HashSet。
2.引用庫
C++中set的實現在一個<set>標頭檔案中,在程式碼開頭引入這個標頭檔案,並且同樣加上一句using namespace std; #include <set> using namespace std; Java中HashSet在java.util.HashSet包裡面實現。通過import的方式引進庫。 import java.util.HashSet;
3.構造一個集合
C++中直接構造一個set的語句:set<T> s.這樣我們定義了一個名為s,儲存T型別的資料的集合,其中T是集合要儲存的資料型別。初始的時候s是空集合。
Java中通過HashSet<T> set = new HashSet<T>()構造一個儲存T型別資料的HashSet物件。
4.插入元素
C++中用insert()方法向集合中插入一個新的元素。注意如果集合中已經存在了某個元素,再次插入不會產生任何效果,集合中是不會出現重複元素的。 #include <set> #include <string> using namespace std; int main() { set<string> country; // {} country.insert("China"); // {"China"} country.insert("America"); // {"China", "America"} country.insert("France"); // {"China", "America", "France"} return 0; }
Java通過add()向集合中新增元素,注意如果集合中已經存在了某個元素,再次插入不會產生任何效果,集合中是不會出現重複元素的。 import java.util.HashSet; public class HashSetTest { public static void main(String[] args) { HashSet<String> country = new HashSet<String>(); // {} country.add("China"); // {"China"} country.add("America"); // {"China", "America"} country.add("France"); // {"China", "America", "France"} } }
5.刪除元素
C++中通過erase()方法刪除集合中的一個元素,如果集合中不存在這個元素,不進行任何操作。
#include <set>
#include <string>
using namespace std;
int main() {
set<string> country; // {}
country.insert("China"); // {"China"}
country.insert("America"); // {"China", "America"}
country.insert("France"); // {"China", "America", "France"}
country.erase("America"); // {"China", "France"}
country.erase("England"); // {"China", "France"}
return 0;
}
Java中通過remove()方法刪除集合中的一個元素,如果集合中不存在這個元素,不進行任何操作。
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> country = new HashSet<String>(); // {}
country.add("China"); // {"China"}
country.add("America"); // {"China", "America"}
country.add("France"); // {"China", "America", "France"}
country.remove("America"); // {"China", "France"}
country.remove("England"); // {"China", "France"}
}
}
6.查詢元素
C++中如果你想知道某個元素是否出現在集合中,你可以直接用count()方法。如果集合中存在我們要查詢的元素,返回1(true),否則返回0(false)。
#include <set>
#include <string>
#include <stdio.h>
using namespace std;
int main() {
set<string> country; // {}
country.insert("China"); // {"China"}
country.insert("America"); // {"China", "America"}
country.insert("France"); // {"China", "America", "France"}
if (country.count("China")) {
printf("China belong to country");
}
return 0;
}
Java中如果你想知道某個元素是否在集合中出現,你可以直接用contains()方法。如果集合中存在我們要查詢的元素,返回true,否則會返回false。
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> country = new HashSet<String>(); // {}
country.add("China"); // {"China"}
country.add("America"); // {"China", "America"}
country.add("France"); // {"China", "America", "France"}
if (country.contains("China")) {
System.out.println("China belong to country");
}
}
}
7.遍歷元素
C++通過迭代器可以訪問集合中的每個元素,迭代器就好比指向集合中的元素的指標。如果你不瞭解迭代器,你只需要先記住用法。
#include <set>
#include <string>
#include <iostream>
using namespace std;
int main() {
set<string> country; // {}
country.insert("China"); // {"China"}
country.insert("America"); // {"China", "America"}
country.insert("France"); // {"China", "America", "France"}
for (set<string>::iterator it = country.begin(); it != country.end(); ++it) {
cout << (*it) << endl;
}
return 0;
}
因為set集合不是陣列不能像vector一樣進行cout<<country[i];
Java中遍歷元素的方法很簡單,只需要“一個冒號”即可完成遍歷。
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> country = new HashSet<String>(); // {}
country.add("China"); // {"China"}
country.add("America"); // {"China", "America"}
country.add("France"); // {"China", "America", "France"}
for (String name : country) {
System.out.println(name);
}
}
}
注意:在C++遍歷set是從小到大進行的,而Java中的HashSet是無序的,如果需要將所有元素有序輸出,需要將所有元素取出後對其進行排序。
8.清空
C++和Java中都需要呼叫clear()方法就可清空set或者HashSet。