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是 鍵 值 對的...