關聯陣列map和關聯容器set的用法和二者的區別

2021-06-16 10:44:08 字數 4204 閱讀 8523

map(也叫關聯陣列):

map是stl的乙個關聯容器,它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的,後邊我們會見識到有序的好處。

1. map的建構函式

mapmaphai;

mapmaphai;

mapmapstring;

mapmapstring;

mapmapint;

mapmapchar;

2. 資料的插入

在構造map容器後,我們就可以往裡面插入資料了。這裡講三種插入資料的方法:

第一種:用insert函式插入pair資料,

#include

#include

#include

using namespace std;

int main()

} 第二種:用insert函式插入value_type資料,下面

舉例 說明

#include

#include

#include

using namespace std;

int main()

} 第三種:用

陣列 方式插入資料,下面舉例說明

#include

#include

#include

using namespace std;

int main()

} 以上三種用法,雖然都可以實現資料的插入,但是它們是有區別的,當然了第一種和第二種在效果上是完成一樣的,用insert函式插入資料,在資料的插入上涉及到集合的唯一性這個概念,即當map中有這個關鍵字時,insert操作是插入資料不了的,但是用

陣列 方式就不同了,它可以覆蓋以前該關鍵字對應的值,用程式說明

mapstudent.insert(map::value_type (1,「student_one」));

mapstudent.insert(map::value_type (1,「student_two」));

上面這兩條語句執行後,map中1這個關鍵字對應的值是「student_one」,第二條語句並沒有生效,那麼這就涉及到我們怎麼知道insert語句是否插入成功的問題了,可以用pair來獲得是否插入成功,程式如下

pair::iterator,bool> insert_pair;

insert_pair = mapstudent.insert(map::value_type (1,「student_one」));

我們通過pair的第二個變數來知道是否插入成功,它的第乙個變數返回的是乙個map的迭代器,如果插入成功的話insert_pair.second應該是true的,否則為false。

下面給出完成**,演示插入成功與否問題

#include

#include

#include

using namespace std;

int main()

else

insert_pair = mapstudent.insert(pair(1,「student_two」));

if(insert_pair.second == true)

else

map::iterator iter;

for(iter = mapstudent.begin(); iter != mapstudent.end(); iter++)

} 大家可以用如下程式,看下用陣列插入在資料覆蓋上的效果

#include

#include

#include

using namespace std;

int main()

} 3. map的大小

在往map裡面插入了資料,我們怎麼知道當前已經插入了多少資料呢,可以用size函式,用法如下:

int nsize = mapstudent.size();

4. 資料的遍歷

這裡也提供三種方法,對map進行遍歷

第一種:應用前向迭代器,上面舉例程式中到處都是了,略過不表

第二種:應用反相迭代器,下面舉例說明,要體會效果,請自個動手執行程式

#include

#include

#include

using namespace std;

int main()

} 第三種:用陣列方式,程式說明如下

#include

#include

#include

using namespace std;

int main()

} set關聯容器:

set是c++標準庫中的一種關聯容器。所謂關聯容器就是通過鍵(key)來讀取和修改元素。與

map 關聯容器不同,它只是單純鍵的集合。

set容器的每乙個鍵只能對應乙個元素,即不存在鍵相同的不同元素。

示例**:

#include

#include

#include

int main(int argc, char* argv)

std::cout<< "vector : " << std::endl;

for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)

std::cout<< std::endl;

std::setst(vec.begin(), vec.end());

std::cout<< "set : " << std::endl;

for(std::set::iterator it = st.begin(); it != st.end(); ++it)

std::cout<< std::endl;

return 0;

}輸出結果:

vector :

0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9

set :

0,1,2,3,4,5,6,7,8,9

建立了乙個int型的

vector

容器,儲存20個資料,0~9每個數字都出現了兩次。用整個

vector

初始化乙個int型set容器,這個set容器卻只有10個元素,0~9每個數字只出現一次。證實了set容器的每乙個鍵只能對應乙個元素。

可以使用insert操作向set容器新增元素。

示例**:

#include

#include

#include

int main(int argc, char* argv)

std::cout<< std::endl;

return 0;

}輸出結果:

set : 1 2 10

insert()的引數既可以是乙個鍵,也可以是一對

迭代器 ,它們都可以實現向set容器中新增元素,只不過函式的返回值不同。另外,可以看出向set容器中新增元素後,它會自動排序。

與map容器不同,set容器不支援下標操作訪問元素。

使用count()函式可以查詢元素是否存在,如果查詢的元素存在則返回1,反之則0。使用find()函式,如果查詢的元素存在則返回指向該元素的

迭代器 ,反之則返回超出末端

迭代器 。

示例**:

#include

#include

int main(int argc, char* argv)

輸出結果:

count(5) : 1

find(5): 5

使用count()和find()函式查詢同一元素5,count()函式返回的是該元素在set容器中的數量,find()函式則返回指向該元素的

迭代器 。需要注意的是,雖然使用find()函式可以返回指向該元素的

迭代器 ,但只能對其做讀操作,任何試圖修改鍵值的操作都是非法的。

二者的區別:

1、map容器是鍵/值對的集合,與

map 關聯容器不同,set它只是單純鍵的集合。

2、map容器支援下標操作符訪問元素,map容器不同,set容器不支援下標操作訪問元素。

參考**:

關聯容器 set

set容器用來儲存同一資料型別的資料,並且能從乙個資料集合中取出資料,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序,set元素的值不能直接被改變。set容器內部採用一種非常高效平衡檢索二叉樹 紅黑樹 mset.begin 返回set容器的第乙個元素的迭代器 mset.end 返回...

map關聯容器

資料表記錄包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值公升序進行輸出。輸入描述 先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出描述 輸出合併後的鍵值對 多行 輸入例子 4 0 10 2 1 23 4 輸出例子 0 3 ...

關聯容器map

map是一種key value關聯的容器,第乙個稱為關鍵字,只能在map中出現一次,第二個稱為關鍵字的值。特點 map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。1 map是 鍵 值 對的...