C++ Map 容器操作实例
// Test_20110514_1853.cpp : Defines the entry point for the console application.
//
//说明:最下面有总结说明。
#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.创建一个map容器变量
TMyMap enumMap;
//往map中加入元素
PrintSplitterString();
cout << "操作:往map 中添加元素方法一" << endl;
enumMap[1] = "One";
enumMap[2] = "Two";
enumMap[2] = "Seven"; //此时将是修改键为的值,如果该键元素不存在,则新建一个
CoutMapList(enumMap);
//////////////////////////////////////////////////////////////////////////
//* 说明:使用此方法的优点是:十分的方便。
//* 缺点:效果不高。因为map 类已经对[] 操作符进行了重载
//* 比如,在插入第个元素时,系统需要先在enumMap中查找主键为的项,没有发现,然后新的对象插入enumMap,键是
//* 1,值是一个空的字符串。插入完成后,再将将显式的Two字符串,赋给值。如果我们要插入的是一个类对象了?
//* 那将会是个很大的开销。
//* 缺点:如果先前已经存在了键为的元素时,则将变成值修改
//////////////////////////////////////////////////////////////////////////
cout << endl << "操作:往map 中添加元素方法二" << endl;
enumMap.insert(TMyMap::value_type(2, "Third"));
//////////////////////////////////////////////////////////////////////////
//* 说明:此方法解决了上面方法的缺点,但有个地方需要注意:
//* 如果列表中已经存在键为的元素时,它是不会插入新的元素的。
//////////////////////////////////////////////////////////////////////////
enumMap.insert(TMyMap::value_type(3, "Third"));
CoutMapList(enumMap);
PrintSplitterString();
//查找并获取map中的元素
PrintSplitterString();
cout << "操作:查找并获取map 中元素" << endl;
//方法一:通过下标获得一个值(此适用在下标明确的情况下)
string tmp = enumMap[4]; //此方法总是安全的。就算不存在键为的元素,系统也不会报,只是返回的值是空的。因为系统是会新创建一个键为的节点,(值当然为空)
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);//通过一个条目对象删除
//* iterator erase(iterator first, iterator last);//删除一个范围
//* size_type erase(const key& key);//通过键来删除
//* clear();//相漕运于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 << "==> 删除掉第一个元素" << endl;
CoutMapList(enumMap);
cout << endl << endl;
enumMap.clear();
cout << "==> 全部清空" << endl;
CoutMapList(enumMap);
PrintSplitterString();
//所有操作均已经结束
PrintSplitterString();
cout << "所有操作均已经结束" << endl;
PrintSplitterString();
cout << endl;
//*********************************************************************************************
//* 现在总结如下:
//* 对于map的操作。最好不要通过下标进行。比如:想要取一个元素,要先通过查找,有了,再操作,没有。不操作。
//* 否则有可能系统会为你自动添加 “莫名奇妙” 的元素进去你都不知道
//*********************************************************************************************
return 0;
}