程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ STL set常用函數大全

C++ STL set常用函數大全

編輯:關於C++

c++ stl集合set介紹 c++ stl集合(Set)是一種包含已排序對象的關聯容器。set/multiset會根據待定的排序准則,自動將元素排序。兩者不同在於前者不允許元素重復,而後者允許。1) 不能直接改變元素值,因為那樣會打亂原...

 

c++ stl集合set介紹

c++ stl集合(Set)是一種包含已排序對象的關聯容器。set/multiset會根據待定的排序准則,自動將元素排序。兩者不同在於前者不允許元素重復,而後者允許。

1) 不能直接改變元素值,因為那樣會打亂原本正確的順序,要改變元素值必須先刪除舊元素,則插入新元素

2) 不提供直接存取元素的任何操作函數,只能通過迭代器進行間接存取,而且從迭代器角度來看,元素值是常數

3) 元素比較動作只能用於型別相同的容器(即元素和排序准則必須相同)

set模板原型://Key為元素(鍵值)類型

 

 

template , class Alloc=STL_DEFAULT_ALLOCATOR(Key) >

 

從原型可以看出,可以看出比較函數對象及內存分配器采用的是默認參數,因此如果未指定,它們將采用系統默認方式。

 

set的各成員函數列表如下:

c++ stl容器set成員函數:begin()--返回指向第一個元素的迭代器

c++ stl容器set成員函數:clear()--清除所有元素

c++ stl容器set成員函數:count()--返回某個值元素的個數

c++ stl容器set成員函數:empty()--如果集合為空,返回true

c++ stl容器set成員函數:end()--返回指向最後一個元素的迭代器

c++ stl容器set成員函數:equal_range()--返回集合中與給定值相等的上下限的兩個迭代器

c++ stl容器set成員函數:erase()--刪除集合中的元素

c++ stl容器set成員函數:find()--返回一個指向被查找到元素的迭代器

c++ stl容器set成員函數:get_allocator()--返回集合的分配器

c++ stl容器set成員函數:insert()--在集合中插入元素

c++ stl容器set成員函數:lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器

c++ stl容器set成員函數:key_comp()--返回一個用於元素間值比較的函數

c++ stl容器set成員函數:max_size()--返回集合能容納的元素的最大限值

c++ stl容器set成員函數:rbegin()--返回指向集合中最後一個元素的反向迭代器

c++ stl容器set成員函數:rend()--返回指向集合中第一個元素的反向迭代器

c++ stl容器set成員函數:size()--集合中元素的數目

c++ stl容器set成員函數:swap()--交換兩個集合變量

c++ stl容器set成員函數:upper_bound()--返回大於某個值元素的迭代器

c++ stl容器set成員函數:value_comp()--返回一個用於比較元素間的值的函數

 

c++ stl集合set插入,遍歷用法舉例

#include 
#include 
using namespace std; 
//set插入元素操作  
int main() 
{ 
    //定義一個int型集合對象s,當前沒有任何元素.由www.169it.com搜集整理
    set s; 
    s.insert(8);  //第一次插入8,可以插入  
    s.insert(1); 
    s.insert(12); 
    s.insert(6); 
    s.insert(8);   //第二次插入8,重復元素,不會插入  
    set::iterator it; //定義前向迭代器 
    //中序遍歷集合中的所有元素  
    for(it=s.begin();it!=s.end();it++) 
    cout<<*it<

 

更詳細點的用法舉例

 

#include 
#include 
#include 

using namespace std;

struct strLess
{
   bool operator() (const char *s1, const char *s2) const
   {
    return strcmp(s1, s2) < 0;
   }
};

void printSet(set s)
{
copy(s.begin(), s.end(), ostream_iterator(cout, ", ") );

// set::iterator iter;
// for (iter = s.begin(); iter != s.end(); iter++)
//    //cout<<"set["< s1; 
//創建空的set對象,元素類型char*,比較函數對象(即排序准則)為自定義strLess
set s2( strLess); 
//利用set對象s1,拷貝生成set對象s2
set s3(s1); 
//用迭代區間[&first, &last)所指的元素,創建一個set對象
int iArray[] = {13, 32, 19};
set s4(iArray, iArray + 3);
//用迭代區間[&first, &last)所指的元素,及比較函數對象strLess,創建一個set對象
const char* szArray[] = {"hello", "dog", "bird" };
set s5(szArray, szArray + 3, strLess() );

//元素插入:
//1,插入value,返回pair配對對象,可以根據.second判斷是否插入成功。(提示:value不能與set容器內元素重復)
//pair insert(value)
//2,在pos位置之前插入value,返回新元素位置,但不一定能插入成功
//iterator insert(&pos, value)
//3,將迭代區間[&first, &last)內所有的元素,插入到set容器
//void insert[&first, &last)
cout<<"s1.insert() : "<::iterator::iterator, bool> p;\np = s1.insert(60);\nif (p.second):"<::iterator::iterator, bool> p;
p = s1.insert(60);
if (p.second)
{cout<<"Insert OK!"<::iterator iter = s1.begin();
s1.erase(iter);
printSet(s1);

//元素查找
//count(value)返回set對象內元素值為value的元素個數
//iterator find(value)返回value所在位置,找不到value將返回end()
//lower_bound(value),upper_bound(value), equal_range(value) 略
cout<<"\ns1.count(10) = "< s9;
s9.insert(100);
cout<<" s1:="" s9:="" pre="">

 

 

自定義比較函數

使用insert將元素插入到集合中去的時候,集合會根據設定的比較函數獎該元素放到該放的節點上去。在定義集合的時候,如果沒有指定比較函數,那麼采用默認的比較函數,即按鍵值從小到大的順序插入元素。但在很多情況下,需要自己編寫比較函數。

編寫比較函數有兩種方法。

(1)如果元素不是結構體,那麼可以編寫比較函數。下面的程序比較規則為按鍵值從大到小的順序插入到集合中。

#include
#include
using namespace std;
struct mycomp
{ //自定義比較函數,重載“()”操作符
	bool operator() (const int &a, const int &b)
	{
		if(a != b)
			return a > b;
		else
			return a > b;
	}
};
int main()
{
	set s; //采用比較函數mycomp
	s.insert(5); //第一次插入5,可以插入
	s.insert(1);
	s.insert(6);
	s.insert(3);
	s.insert(5); //第二次插入5,重復元素,不會插入
	set::iterator it;
	for(it = s.begin(); it != s.end(); it++)
		cout << *it << " ";
	cout << endl;
	return 0;
}
/*
運行結果:6 5 3 1  
*/

(2)如果元素是結構體,那麼可以直接把比較函數寫在結構體內。

 

#include
#include
#include
using namespace std;
struct Info
{
	string name;
	double score;
	bool operator < (const Info &a) const // 重載“<”操作符,自定義排序規則
	{
		//按score由大到小排序。如果要由小到大排序,使用“>”即可。
		return a.score < score;
	}
};
int main()
{
	set s;
	Info info;

	//插入三個元素
	info.name = "Jack";
	info.score = 80;
	s.insert(info);
	info.name = "Tom";
	info.score = 99;
	s.insert(info);
	info.name = "Steaven";
	info.score = 60;
	s.insert(info);

	set::iterator it;
	for(it = s.begin(); it != s.end(); it++)
		cout << (*it).name << " : " << (*it).score << endl; 
	return 0;
}
/*
運行結果:
Tom : 99
Jack : 80
Steaven : 60
*/


 

 

 

 

 

 

集合的用法
 

#include 
#include 
#include 
using namespace std;
 
int main()
{
       int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
       set S( a, a + 9 );
      
       int b[] = { 3, 6, 8, 9 };
       set S2( b, b + 4 );
      
       set::iterator site;
 
       set Su;
       set Si;
       set Sd;
       set Ssd;
      
       //交集
       set_intersection( S.begin(), S.end(),
                                   S2.begin(), S2.end(),
                                   inserter( Si, Si.begin() ) );
                                  
       //並集
       set_union( S.begin(), S.end(),
                     S2.begin(), S2.end(),
                        inserter( Su, Su.begin() ) );
                       
       //差集
       set_difference( S.begin(), S.end(),
                                S2.begin(), S2.end(),
                                   inserter( Sd, Sd.begin() ) );
      
       //對稱差集
       set_symmetric_difference( S.begin(), S.end(),
                                                S2.begin(), S2.end(),
                                                 inserter( Ssd, Ssd.begin() ) );
                                                
      
       site = Si.begin();
       cout<<"the intersection of S and S2 is : ";
       while( site != Si.end() )
       {
              cout<< *site <<" ";
              ++ site;
       }
       cout<
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved