set容器

集合(Set)是一種包含已排序對象的關聯容器

簡介

set是C++標準庫中的一種關聯容器。所謂關聯容器就是通過鍵(key)來讀取和修改元素。與map關聯容器不同,它只是單純鍵的集合。

特性

set容器的每一個鍵只能對應一個元素,即不存在鍵相同的不同元素。

示例代碼:

#include <iostream>

#include <set>

#include <vector>

int main(int argc, char* argv[]) {

std::vector<int>vec;

for(std::vector<int>::size_type i = 0; i < 10; ++i) {

vec.push_back(i);

vec.push_back(i);

}

std::cout<< "vector : " << std::endl;

for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {

std::cout<< *it << ",";

}

std::cout<< std::endl;

std::set<int>st(vec.begin(), vec.end());

std::cout<< "set : " << std::endl;

for(std::set<int>::iterator it = st.begin(); it != st.end(); ++it) {

std::cout<< *it << ",";

}

std::cout<< std::endl;

return 0;

}

輸出結果:

vector :

0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9

set :

0,1,2,3,4,5,6,7,8,9

創建了一個int型的vector容器,存儲20個數據,0~9每個數字都出現了兩次。用整個vector初始化一個int型set容器,這個set容器卻只有10個元素,0~9每個數字只出現一次。證實了set容器的每一個鍵只能對應一個元素。

添加元素

可以使用insert操作向set容器添加元素。

示例代碼:

#include <iostream>

#include <set>

#include <vector>

int main(int argc, char* argv[]) {

std::vector<int>vec;

vec.push_back(1);

vec.push_back(2);

std::set<int>st;

st.insert(10);

st.insert(vec.begin(),vec.end());

std::cout<< "set : ";

for(std::set<int>::iterator it = st.begin(); it != st.end(); ++it) {

std::cout<< *it << " ";

}

std::cout<< std::endl;

return 0;

}

輸出結果:

set : 1 2 10

insert()的參數既可以是一個鍵,也可以是一對疊代器,它們都可以實現向set容器中添加元素,只不過函式的返回值不同。另外,可以看出向set容器中添加元素後,它會自動排序。

獲取元素

與map容器不同,set容器不支持下標操作訪問元素。

使用count()函式可以查詢元素是否存在,如果查詢的元素存在則返回1,反之則0。使用find()函式,如果查詢的元素存在則返回指向該元素的疊代器,反之則返回超出末端疊代器。

示例代碼:

#include <iostream>

#include <set>

int main(int argc, char* argv[]) {

std::set<int> st;

st.insert(1);

st.insert(5);

st.insert(10);

std::cout<< "count(5) : " << st.count(5) << std::endl;

std::cout<< "find(5): " << *st.find(5) << std::endl;

return 0;

}

輸出結果:

count(5) : 1

find(5): 5

使用count()和find()函式查詢同一元素5,count()函式返回的是該元素在set容器中的數量,find()函式則返回指向該元素的疊代器。需要注意的是,雖然使用find()函式可以返回指向該元素的疊代器,但只能對其做讀操作,任何試圖修改鍵值的操作都是非法的。

相關詞條

相關搜尋

熱門詞條

聯絡我們