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,值是乙個空字串,插入完...