/*
set/multiset會根據待定的排序準則,自動将元素排序。兩者不同在于前者不允許元素重複,而後者允許。
1) 不能直接改變元素值,因為那樣會打亂原本正确的順序,要改變元素值必須先删除舊元素,則插入新元素
2) 不提供直接存取元素的任何操作函數,隻能通過疊代器進行間接存取,而且從疊代器角度來看,元素值是常數
3) 元素比較動作隻能用于型别相同的容器(即元素和排序準則必須相同)
set模闆原型://key為元素(鍵值)類型
template <class key, class compare=less<key>, class alloc=stl_default_allocator(key) >
從原型可以看出,可以看出比較函數對象及記憶體配置設定器采用的是預設參數,是以如果未指定,它們将采用系統預設方式,
另外,利用原型,可以有效地輔助分析建立對象的幾種方式
*/
#include <iostream>
#include <string>
#include <set>
using namespace std;
struct strless
{
bool operator() (const char *s1, const char *s2) const
{
return strcmp(s1, s2) < 0;
}
};
void printset(set<int> s)
copy(s.begin(), s.end(), ostream_iterator<int>(cout, ", ") );
// set<int>::iterator iter;
// for (iter = s.begin(); iter != s.end(); iter++)
// //cout<<"set["<<iter-s.begin()<<"]="<<*iter<<", "; //error
// cout<<*iter<<", ";
cout<<endl;
}
void main()
//建立set對象,共5種方式,提示如果比較函數對象及記憶體配置設定器未出現,即表示采用的是系統預設方式
//建立空的set對象,元素類型為int,
set<int> s1;
//建立空的set對象,元素類型char*,比較函數對象(即排序準則)為自定義strless
set<const char*, strless> s2( strless);
//利用set對象s1,拷貝生成set對象s2
set<int> s3(s1);
//用疊代區間[&first, &last)所指的元素,建立一個set對象
int iarray[] = {13, 32, 19};
set<int> s4(iarray, iarray + 3);
//用疊代區間[&first, &last)所指的元素,及比較函數對象strless,建立一個set對象
const char* szarray[] = {"hello", "dog", "bird" };
set<const char*, strless> s5(szarray, szarray + 3, strless() );
//元素插入:
//1,插入value,傳回pair配對對象,可以根據.second判斷是否插入成功。(提示:value不能與set容器内元素重複)
//pair<iterator, bool> insert(value)
//2,在pos位置之前插入value,傳回新元素位置,但不一定能插入成功
//iterator insert(&pos, value)
//3,将疊代區間[&first, &last)内所有的元素,插入到set容器
//void insert[&first, &last)
cout<<"s1.insert(
) : "<<endl;
for (int i = 0; i <5 ; i++)
s1.insert(i*10);
printset(s1);
cout<<"s1.insert(20).second = "<<endl;;
if (s1.insert(20).second)
cout<<"insert ok!"<<endl;
else
cout<<"insert failed!"<<endl;
cout<<"s1.insert(50).second = "<<endl;
if (s1.insert(50).second)
{cout<<"insert ok!"<<endl; printset(s1);}
cout<<"pair<set<int>::iterator::iterator, bool> p;\np = s1.insert(60);\nif (p.second):"<<endl;
pair<set<int>::iterator::iterator, bool> p;
p = s1.insert(60);
if (p.second)
cout<<"insert failed!"<<endl;
//元素删除
//1,size_type erase(value) 移除set容器内元素值為value的所有元素,傳回移除的元素個數
//2,void erase(&pos) 移除pos位置上的元素,無傳回值
//3,void erase(&first, &last) 移除疊代區間[&first, &last)内的元素,無傳回值
//4,void clear(), 移除set容器内所有元素
cout<<"\ns1.erase(70) = "<<endl;
s1.erase(70);
cout<<"s1.erase(60) = "<<endl;
s1.erase(60);
cout<<"set<int>::iterator iter = s1.begin();\ns1.erase(iter) = "<<endl;
set<int>::iterator iter = s1.begin();
s1.erase(iter);
//元素查找
//count(value)傳回set對象内元素值為value的元素個數
//iterator find(value)傳回value所在位置,找不到value将傳回end()
//lower_bound(value),upper_bound(value), equal_range(value) 略
cout<<"\ns1.count(10) = "<<s1.count(10)<<", s1.count(80) = "<<s1.count(80)<<endl;
cout<<"s1.find(10) : ";
if (s1.find(10) != s1.end())
cout<<"ok!"<<endl;
cout<<"not found!"<<endl;
cout<<"s1.find(80) : ";
if (s1.find(80) != s1.end())
//其它常用函數
cout<<"\ns1.empty()="<<s1.empty()<<", s1.size()="<<s1.size()<<endl;
set<int> s9;
s9.insert(100);
cout<<"s1.swap(s9) :"<<endl;
s1.swap(s9);
cout<<"s1: "<<endl;
cout<<"s9: "<<endl;
printset(s9);
//lower_bound,upper_bound,equal_range(略)
///////////////i測試結果/////////////////////////
s1.insert(
) :
0, 10, 20, 30, 40,
s1.insert(20).second =
insert failed!
s1.insert(50).second =
insert ok!
0, 10, 20, 30, 40, 50,
if (p.second):
0, 10, 20, 30, 40, 50, 60,
s1.erase(70) =
s1.erase(60) =
s1.erase(iter) =
10, 20, 30, 40, 50,
s1.count(10) = 1, s1.count(80) = 0
s1.find(10) : ok!
s1.find(80) : not found!
s1.empty()=0, s1.size()=5
s1.swap(s9) :
s1:
100,
s9: