1. 程式人生 > >STL庫中的集合set簡介(C++,Java)

STL庫中的集合set簡介(C++,Java)

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。

9.常用方法總結