C++ Map 容器操作實(shí)例
// Test_20110514_1853.cpp : Defines the entry point for the console application.
//
//說明:最下面有總結(jié)說明。
#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;
typedef map<int, string> TMyMap;
void PrintSplitterString(short sCount = 50)
{
if (sCount < 20 || sCount > 80)
sCount = 50;
for (short i = 1; i <= sCount; i++)
cout << "-";
cout << endl;
}
void CoutMapList(const TMyMap& mmMap)
{
for (TMyMap::const_iterator iter = mmMap.begin(); iter != mmMap.end(); iter++)
{
string str = iter->second;
cout << "鍵:" << iter->first << " 值:" << str.c_str() << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//*****************************************************************************************
// * 在此介紹map容器的用法
//*****************************************************************************************
//1.創(chuàng)建一個(gè)map容器變量
TMyMap enumMap;
//往map中加入元素
PrintSplitterString();
cout << "操作:往map 中添加元素方法一" << endl;
enumMap[1] = "One";
enumMap[2] = "Two";
enumMap[2] = "Seven"; //此時(shí)將是修改鍵為的值,如果該鍵元素不存在,則新建一個(gè)
CoutMapList(enumMap);
//////////////////////////////////////////////////////////////////////////
//* 說明:使用此方法的優(yōu)點(diǎn)是:十分的方便。
//* 缺點(diǎn):效果不高。因?yàn)閙ap 類已經(jīng)對(duì)[] 操作符進(jìn)行了重載
//* 比如,在插入第個(gè)元素時(shí),系統(tǒng)需要先在enumMap中查找主鍵為的項(xiàng),沒有發(fā)現(xiàn),然后新的對(duì)象插入enumMap,鍵是
//* 1,值是一個(gè)空的字符串。插入完成后,再將將顯式的Two字符串,賦給值。如果我們要插入的是一個(gè)類對(duì)象了?
//* 那將會(huì)是個(gè)很大的開銷。
//* 缺點(diǎn):如果先前已經(jīng)存在了鍵為的元素時(shí),則將變成值修改
//////////////////////////////////////////////////////////////////////////
cout << endl << "操作:往map 中添加元素方法二" << endl;
enumMap.insert(TMyMap::value_type(2, "Third"));
//////////////////////////////////////////////////////////////////////////
//* 說明:此方法解決了上面方法的缺點(diǎn),但有個(gè)地方需要注意:
//* 如果列表中已經(jīng)存在鍵為的元素時(shí),它是不會(huì)插入新的元素的。
//////////////////////////////////////////////////////////////////////////
enumMap.insert(TMyMap::value_type(3, "Third"));
CoutMapList(enumMap);
PrintSplitterString();
//查找并獲取map中的元素
PrintSplitterString();
cout << "操作:查找并獲取map 中元素" << endl;
//方法一:通過下標(biāo)獲得一個(gè)值(此適用在下標(biāo)明確的情況下)
string tmp = enumMap[4]; //此方法總是安全的。就算不存在鍵為的元素,系統(tǒng)也不會(huì)報(bào),只是返回的值是空的。因?yàn)橄到y(tǒng)是會(huì)新創(chuàng)建一個(gè)鍵為的節(jié)點(diǎn),(值當(dāng)然為空)
cout << tmp.c_str() << endl;
//另一種取得元素的方法是,通過查找
TMyMap::const_iterator iter_find = enumMap.find(2);
if (iter_find != enumMap.end())
{
//找到了
cout << iter_find->second.c_str() << endl;
}
else
{
//沒有找到
cout << "沒有找到。" << endl;
}
PrintSplitterString();
//從map 中刪除元素
PrintSplitterString();
cout << "操作:從map 中刪除元素的方法" << endl;
//////////////////////////////////////////////////////////////////////////
//* 刪除的方法有:
//* iterator erase(iterator it);//通過一個(gè)條目對(duì)象刪除
//* iterator erase(iterator first, iterator last);//刪除一個(gè)范圍
//* size_type erase(const key& key);//通過鍵來刪除
//* clear();//相漕運(yùn)于enumMap.erase(enumMap.begin(), enumMap.end());
//////////////////////////////////////////////////////////////////////////
cout << "==> 全部列表如下:" << endl;
CoutMapList(enumMap);
enumMap.erase(3);
cout << "==> 刪除掉鍵值為:的" << endl;
CoutMapList(enumMap);
cout << endl << endl;
enumMap.erase(enumMap.begin());
cout << "==> 刪除掉第一個(gè)元素" << endl;
CoutMapList(enumMap);
cout << endl << endl;
enumMap.clear();
cout << "==> 全部清空" << endl;
CoutMapList(enumMap);
PrintSplitterString();
//所有操作均已經(jīng)結(jié)束
PrintSplitterString();
cout << "所有操作均已經(jīng)結(jié)束" << endl;
PrintSplitterString();
cout << endl;
//*********************************************************************************************
//* 現(xiàn)在總結(jié)如下:
//* 對(duì)于map的操作。最好不要通過下標(biāo)進(jìn)行。比如:想要取一個(gè)元素,要先通過查找,有了,再操作,沒有。不操作。
//* 否則有可能系統(tǒng)會(huì)為你自動(dòng)添加 “莫名奇妙” 的元素進(jìn)去你都不知道
//*********************************************************************************************
return 0;
}
// Test_20110514_1853.cpp : Defines the entry point for the console application.
//
//說明:最下面有總結(jié)說明。
#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;
typedef map<int, string> TMyMap;
void PrintSplitterString(short sCount = 50)
{
if (sCount < 20 || sCount > 80)
sCount = 50;
for (short i = 1; i <= sCount; i++)
cout << "-";
cout << endl;
}
void CoutMapList(const TMyMap& mmMap)
{
for (TMyMap::const_iterator iter = mmMap.begin(); iter != mmMap.end(); iter++)
{
string str = iter->second;
cout << "鍵:" << iter->first << " 值:" << str.c_str() << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//*****************************************************************************************
// * 在此介紹map容器的用法
//*****************************************************************************************
//1.創(chuàng)建一個(gè)map容器變量
TMyMap enumMap;
//往map中加入元素
PrintSplitterString();
cout << "操作:往map 中添加元素方法一" << endl;
enumMap[1] = "One";
enumMap[2] = "Two";
enumMap[2] = "Seven"; //此時(shí)將是修改鍵為的值,如果該鍵元素不存在,則新建一個(gè)
CoutMapList(enumMap);
//////////////////////////////////////////////////////////////////////////
//* 說明:使用此方法的優(yōu)點(diǎn)是:十分的方便。
//* 缺點(diǎn):效果不高。因?yàn)閙ap 類已經(jīng)對(duì)[] 操作符進(jìn)行了重載
//* 比如,在插入第個(gè)元素時(shí),系統(tǒng)需要先在enumMap中查找主鍵為的項(xiàng),沒有發(fā)現(xiàn),然后新的對(duì)象插入enumMap,鍵是
//* 1,值是一個(gè)空的字符串。插入完成后,再將將顯式的Two字符串,賦給值。如果我們要插入的是一個(gè)類對(duì)象了?
//* 那將會(huì)是個(gè)很大的開銷。
//* 缺點(diǎn):如果先前已經(jīng)存在了鍵為的元素時(shí),則將變成值修改
//////////////////////////////////////////////////////////////////////////
cout << endl << "操作:往map 中添加元素方法二" << endl;
enumMap.insert(TMyMap::value_type(2, "Third"));
//////////////////////////////////////////////////////////////////////////
//* 說明:此方法解決了上面方法的缺點(diǎn),但有個(gè)地方需要注意:
//* 如果列表中已經(jīng)存在鍵為的元素時(shí),它是不會(huì)插入新的元素的。
//////////////////////////////////////////////////////////////////////////
enumMap.insert(TMyMap::value_type(3, "Third"));
CoutMapList(enumMap);
PrintSplitterString();
//查找并獲取map中的元素
PrintSplitterString();
cout << "操作:查找并獲取map 中元素" << endl;
//方法一:通過下標(biāo)獲得一個(gè)值(此適用在下標(biāo)明確的情況下)
string tmp = enumMap[4]; //此方法總是安全的。就算不存在鍵為的元素,系統(tǒng)也不會(huì)報(bào),只是返回的值是空的。因?yàn)橄到y(tǒng)是會(huì)新創(chuàng)建一個(gè)鍵為的節(jié)點(diǎn),(值當(dāng)然為空)
cout << tmp.c_str() << endl;
//另一種取得元素的方法是,通過查找
TMyMap::const_iterator iter_find = enumMap.find(2);
if (iter_find != enumMap.end())
{
//找到了
cout << iter_find->second.c_str() << endl;
}
else
{
//沒有找到
cout << "沒有找到。" << endl;
}
PrintSplitterString();
//從map 中刪除元素
PrintSplitterString();
cout << "操作:從map 中刪除元素的方法" << endl;
//////////////////////////////////////////////////////////////////////////
//* 刪除的方法有:
//* iterator erase(iterator it);//通過一個(gè)條目對(duì)象刪除
//* iterator erase(iterator first, iterator last);//刪除一個(gè)范圍
//* size_type erase(const key& key);//通過鍵來刪除
//* clear();//相漕運(yùn)于enumMap.erase(enumMap.begin(), enumMap.end());
//////////////////////////////////////////////////////////////////////////
cout << "==> 全部列表如下:" << endl;
CoutMapList(enumMap);
enumMap.erase(3);
cout << "==> 刪除掉鍵值為:的" << endl;
CoutMapList(enumMap);
cout << endl << endl;
enumMap.erase(enumMap.begin());
cout << "==> 刪除掉第一個(gè)元素" << endl;
CoutMapList(enumMap);
cout << endl << endl;
enumMap.clear();
cout << "==> 全部清空" << endl;
CoutMapList(enumMap);
PrintSplitterString();
//所有操作均已經(jīng)結(jié)束
PrintSplitterString();
cout << "所有操作均已經(jīng)結(jié)束" << endl;
PrintSplitterString();
cout << endl;
//*********************************************************************************************
//* 現(xiàn)在總結(jié)如下:
//* 對(duì)于map的操作。最好不要通過下標(biāo)進(jìn)行。比如:想要取一個(gè)元素,要先通過查找,有了,再操作,沒有。不操作。
//* 否則有可能系統(tǒng)會(huì)為你自動(dòng)添加 “莫名奇妙” 的元素進(jìn)去你都不知道
//*********************************************************************************************
return 0;
}