STL中的容器分為兩大類:序列式容器和關聯(lián)式容器。
序列式容器有vector、list、deque、forward_list等,為什么他們被稱為序列式容器呢?因為他們的底層為線性序列的數(shù)據(jù)結構,里面存儲的是元素本身。關聯(lián)式容器也是用來存儲數(shù)據(jù)的,與序列式容器不同的是,其里面存儲的是
鍵值對用來表示具有一一對應關系的一種結構,該結構中一般只包含兩個成員變量key和value,key代表鍵值,value表示與key對應的信息。
SGI-STL中關于鍵值對的定義:
struct pair
{typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair():first(T1()),second(T2())//零初始化
{}
pair(const T1& a,const T2& b):first(a),first(b)
{}
};
有下面這幾種方法來構造鍵值對:
int main()
{pairv;//v被定義為鍵值對類型,那就有了兩個成員變量
v.first = 1;
v.second = "hello";
cout<< v.first<< " : "<< v.second<< endl;//1 : hello
pairv1(2, "Linux");
cout<< v1.first<< " : "<< v1.second<< endl;//2 : Linux
v = v1;
cout<< v.first<< " : "<< v.second<< endl;//2 : Linux
pairv2 = make_pair(3, "C++");
cout<< v2.first<< " : "<< v2.second<< endl;//3 : C++
return 0;
}
set
基本介紹注意:
驗證set中的元素默認按照小于進行排序:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//1 2 3 4 5 6 7 8 9
cout<< endl;
}
如果想要從大到小排序,則在構造的時候加上greater:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
set>is(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//9 8 7 6 5 4 3 2 1
cout<< endl;
}
set的模板參數(shù)列表template, class Alloc = allocator>class set;
set的構造T:set中存放元素的類型,實際在底層存儲
的鍵值對
Compare:set中元素默認按照小于來比較
Alloc:set中元素空間的管理方式,使用STL提供的空間配置器。
void main()
{sets1;//構造空的set
int ar[] = {8,5,3,7,6,4,2,9,1 };
int n = sizeof(ar) / sizeof(ar[0]);
sets2(ar, ar + n);//用(first,last)區(qū)間中的元素構造set
vectorvi = {8,5,3,7,6,4,2,9,1 };
sets3(vi.begin(), vi.end());//用(first,last)區(qū)間中的元素構造set
s1 = s3;//拷貝構造
}
set的迭代器set的修改操作函數(shù)聲明 | 功能 |
---|---|
pair | 在set中插入元素x,實際插入的是 |
size_type erase ( const key_type& x ) | 刪除set中值為x的元素,返回被刪除的元素的個數(shù) |
void erase ( iterator position ) | 刪除set中position位置上的元素 |
void erase ( iterator first, iterator last ) | 刪除set中(first,last)區(qū)間中的元素 |
size_type count ( const key_type& x ) const | 返回set中值為x的元素的個數(shù) |
void swap ( set | 交換set中的元素 |
swap代碼驗證:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
vectoriv1 = {6,7,8,3 };
setis1(iv1.begin(), iv1.end());
is1.swap(is);
}
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
auto res = is.lower_bound(7);//>=7
//auto res = is.upper_bound(6);//>6
cout<< *res<< endl;
}
map
基本介紹typedef pair value_type;
template,//比較器的類型
class Alloc = allocator>//通過空間配置器來申請底層空間
>class map;
map的構造void main()
{mapismap;
mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
}
map的迭代器map的元素訪問函數(shù)聲明 | 功能 |
---|---|
size_type size() const | 返回map中有效元素的個數(shù) |
mapped_type& operator[] (const key_type&k) | 返回key對應的value |
void main()
{mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
cout<< ismap.size()<< endl;//3
cout<< ismap.at(4)<< endl;//Job
cout<< ismap[4]<< endl;//Job
cout<< ismap[8]<< endl;//""
//cout<< ismap.at(9)<< endl;//會拋出異常
}
在元素訪問時,at函數(shù)和operator[]都能通過key找到與key對應的value然后返回其引用,不同的是:當key不存在時,operator[]用默認value和key構造鍵值對然后插入,返回該默認value,at()函數(shù)直接拋出異常。
map中元素的修改函數(shù)聲明 | 功能 |
---|---|
pair | 在map中插入鍵值對x,返回值也是一個鍵值對,iterator代表新插入元素的位置,bool代表是否插入成功 |
size_type erase ( const key_type& x ) | 刪除值為x的元素 |
void erase ( iterator position ) | 刪除position位置上的元素 |
void erase ( iterator first, iterator last ) | 刪除(first,last)區(qū)間中的元素 |
size_type count ( const key_type& x ) const | 返回set中值為x的元素的個數(shù) |
void swap ( set | 交換set中的元素 |
const_iterator find ( const key_type& x )const | 在map中查找key為x的元素,找到返回該元素的位置的const迭代器,否則返回cend |
size_type count ( const key_type& x ) const | 返回key為x的鍵值在map中的個數(shù),注意map中key是唯一的,因此該函數(shù)的返回值要么為0,要么為1,因此可以用來檢測一個key是否在map中 |
查找和插入:
void main()
{//2 4 5 8
mapismap = {{5,"Student"},
{2, "Teacher"}, {8, "Study"}, {4, "Job"} };
auto pos = ismap.find(8);//查找,找到返回該元素的迭代器
cout<< pos->first<< " : "<< pos->second<< endl;
pairv = {1,"abc" };
ismap.insert(pos, v);//插入,pos表示新插元素的位置
cout<< pos->first<< " : "<< pos->second<< endl;
for (const auto& e : ismap)
cout<< e.first<< " : "<< e.second<< endl;
}
map總結你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧