C++ STL 之 set/multiset 學習

set與multiset 都是C++ 中的集合類,不同的是set中不允許存在重複元素,而multiset允許存在重複元素。
cplusplus網站列出了兩個類的成員函數:

begin
返回容器首元素指針 (public 成員函數 )
end
返回容器尾元素指針 (public 成員函數)
rbegin
返回容器反向迭代首元素指針(public 成員函數 )
rend
返回容器反向迭代尾元素指針 (public 成員函數 )
cbegin
返回 const_iterator迭代首元素指針 (public 成員函數 )( const_iterator指向的元素不可改變)
cend
返回const_iterator迭代尾元素指針 (public 成員函數 )
crbegin
返回const_reverse_iterator 反向迭代首元素指針 (public 成員函數 )
crend
返回const_reverse_iterator反向迭代尾元素指針 (public 成員函數 )

empty
檢測容器是否爲空 (public 成員函數 )
size
返回容器長度 (public 成員函數 )
max_size
返回最大長度 (public 成員函數 )

修改:
insert
插入元素 (public 成員函數 )
erase
清除元素 (public 成員函數 )
swap
交換集合元素 (public 成員函數 )
clear
清除集合元素 (public 成員函數 )
emplace
構建容器並插入某個元素 (public 成員函數 )
emplace_hint
構建容器並插入指定元素 (public成員函數 )

觀測:
key_comp
返回比較結果 (public member function )
value_comp
返回比較結果 (public member function )

操作:
find
查找容器中元素(public member function )
count
根據查找關鍵字查找元素下標 (public member function )
lower_bound
返回容器某個元素低界(public member function )
upper_bound
返回容器某個元素上界(public member function )
equal_range
返回容器中相同元素的範圍 (public member function )

實例代碼如下:

#include <iostream>
#include <set>

int main ()
{
  std::multiset<int> mymultiset;

  for (int i=0; i<5; i++) mymultiset.insert(i);

  std::multiset<int>::key_compare mycomp = mymultiset.key_comp();

  std::cout << "mymultiset contains:";

  int highest = *mymultiset.rbegin();

  std::multiset<int>::iterator it = mymultiset.begin();
  do {
    std::cout << ' ' << *it;
  } while ( mycomp(*it++,highest) );

  std::cout << '\n';

  return 0;
}

輸出:

mymultiset contains: 0 1 2 3 4

類成員函數可以直接調用。
需要注意的是begin()和end()函數
begin()函數返回的是容器的第一個元素,end()返回的容器中元素的個數,即容器的尾部是容器內有效元素的個數,不知道這樣理解對不對,代碼展示如下:

#include <iostream>
#include <set>
using namespace std;
int main ()
{
  std::multiset<int> myset;
  std::multiset<int>::iterator itlow,itup;

  for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90

cout<<"begin()"<<*myset.begin()<<"   end() "<<*myset.end()<<endl;

  std::cout << "myset contains:";
  for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

輸出如下:
這裏寫圖片描述

另外一個注意的是lower_bound(element)是容器中大於等於element的元素迭代器指針,upper_bound(element)是容器中大於element的元素迭代器指針。
代碼展示如下:

#include <iostream>
#include <set>
using namespace std;
int main ()
{
  std::multiset<int> myset;
  std::multiset<int>::iterator itlow,itup;

  for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90

  itlow=myset.lower_bound (30);                //       ^
  itup=myset.upper_bound (40);                 //                   ^
cout<<*itlow<<"  "<<*itup<<endl;

//cout<<"begin()"<<*myset.begin()<<"   end() "<<*myset.end()<<endl;

  std::cout << "myset contains:";
  for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

輸出:
這裏寫圖片描述
附cplusplus網址:http://www.cplusplus.com/reference/set/multiset/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章