std set 和 std map 的基本用法

2021-09-30 12:02:07 字數 4299 閱讀 3116

std::set成員函式及簡要使用方法

函式 宣告

說明insert

pairinsert(const value_type& x)

iterator insert(iterator position, const value_type& x)

1、向集合中新增乙個元素

2、在迭代器指向的位置上放置指定的元素

count

size_type count(const key_type& x)

計算元素在容器中的個數,對於std::set為1(存在)或者0(不存在)。可用於判斷元素是否存在

find

查詢指定

empty

bool empty()

判斷當前容器是否為空

size

size_type size()

取得當前容器內元素個數

clear

void clear()

清空當前容器

begin

宣告end

宣告rbegin

宣告rend

宣告erase

void erase(iterator position)

void erase(iterator first, iterator last)

size_type erase(const key_type& x)

begin

宣告begin

宣告begin

宣告begin

宣告begin

宣告begin

宣告begin

宣告清空當前當前容器

如果當前容易中的元素是自己new出來的物件的指標,那麼在呼叫clear函式之前,需要自己先釋放掉這部分記憶體。比如進行如下的操作。

myclass *p1 = new myclass();

myclass *p2 = new myclass();

myclass *p3 = new myclass();

std::setset_class;

set_class.insert(p1);

set_class.insert(p2);

set_class.insert(p3);

set_class.clear();

如果程式只進行如上的步驟,那麼p1、p2、p3其實沒有別真正的釋放,如果是在svr中執行的話,會造成記憶體洩露。實際應該如下所示。

myclass *p1 = new myclass();

myclass *p2 = new myclass();

myclass *p3 = new myclass();

std::setset_class;

set_class.insert(p1);

set_class.insert(p2);

set_class.insert(p3);

for (std::set::iterator it = set_class.begin(); it != set_class.end(); it++)

delete *it;

set_class.clear();

對於erase操作也是如此。在刪除元素之前,如有必要先自己釋放記憶體。

獲取資料

1、std::set不提供下表操作符;

2、如果只是判斷元素是否存在,可以使用count函式檢查返回值;

3、如果需要獲取元素值,可使用迭代器。*iterator就是該迭代器指向的值。

std::setset_limit;

set_limit.insert(「user@123」);

set_limit.insert(「user@124」);

set_limit.insert(「user@125」);

//判斷"user@124」是否在集合中

if (set_limit.count(「user@124」) == 1)

cout << 「user@124存在於集合中"<< std::endl;

else

cout << 「user@124不在集合中" << std::endl;

//輸出集合中所有的元素值

for (std::set::iterator it = set_limit.begin(); it != set_limit.end(); it++)

cout << *it << std::endl;

注意:在獲得指向set中某元素的迭代器後,只能對其做讀操作,而不能做寫操作。

std::set型別定義

typedef key key_type;

typedef key value_type;

typedef typename rep_type::const_pointer pointer;

typedef typename rep_type::const_pointer const_pointer;

typedef typename rep_type::const_reference reference;

typedef typename rep_type::const_reference const_reference;

typedef typename rep_type::const_iterator iterator;

typedef typename rep_type::const_iterator const_iterator;

typedef typename rep_type::const_reverse_iterator reverse_iterator;

typedef typename rep_type::const_reverse_iterator const_reverse_iterator;

typedef typename rep_type::size_type size_type;

typedef typename rep_type::difference_type difference_type;

注:深入stl的源**看,可以看到size_type的型別其實是size_t,但也有可能因實現不同而不同。

std::set使用例子

std::set的宣告

std::setset_string; //元素型別是std::string,*迭代器得到的數值型別是std::string

std::setset_int; //元素型別是int,*迭代器得到的數值型別是int

應用場景:兌換物品限制每個使用者只能兌換一次,儲存已兌換的使用者。

map的基本用法:如插入、查詢、刪除、遍歷等等,同時告訴你如何實現雙鍵map,包括

(1) 只有兩個鍵都匹配才命中目標

(2) 兩個鍵中任意乙個匹配就命中目標

可以擴充套件到多鍵

(一) 介紹

特點:1.map將key的object和t的object繫結到一起,因此是一種pair associative container, 表示其value type為 pair。

2.它同時也是unique associative container,表示沒有兩個元素具有相同的key。

3.它還是一種sorted associative container,因此第三個引數只能是less,greater之類的functor, 相比較而言,

hash table是 equal_to, not_equal_to之類的functor。

(二) 基本用法

通過以下範例,可以看出map的一些基本用法: 插入、查詢、刪除、遍歷、遍歷迴圈中刪除等等。

#if defined (_msc_ver)

#pragma warning(disable: 4786)

#endif

#include #include #include int main(int argc, char *ar**)

std::cout

<< std::endl;

if( itr != _map.end() )

std::map::iterator itr1 = _map.begin();

for( ; itr1 != _map.end();)

std::cout

<< "item:"

<< itr1->first << ", content: " << itr1->second << std::endl;

++it; }

std::cout

<< std::endl;

_map.clear();

return 0;}

QMap和std map的遍歷

兩種遍歷方式都使用迭代器 1qmap使用iterator.key 和iterator.value 方法獲取第乙個或第二個元素的值。而std map使用iterator first iterator second 來獲取第乙個或第二個元素的值。qmapm ratiocfg qmap iterator ...

std map的insert和下標 訪問

在map中插入元素 改變map中的條目非常簡單,因為map類已經對操作符進行了過載 enummap 1 one enummap 2 two 這樣非常直觀,但存在乙個效能的問題。插入2時,先在enummap中查詢主鍵為2的項,沒發現,然後將乙個新的物件插入enummap,鍵是2,值是乙個空字串,插入完...

std map的insert和下標 訪問

在map中插入元素 改變map中的條目非常簡單,因為map類已經對操作符進行了過載 enummap 1 one enummap 2 two 這樣非常直觀,但存在乙個效能的問題。插入2時,先在enummap中查詢主鍵為2的項,沒發現,然後將乙個新的物件插入enummap,鍵是2,值是乙個空字串,插入完...