C++ Map 容器操作实例
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 ;
}
// 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 ;
}