映射容器map是一种关联容器,表示的是对偶(键,值)的序列。它支持唯一Key类型的键值,并提供对另一个基于键的类型T的快速检索。map还提供双向迭代器。映射容器map在标准C++中,对应于map类,被定义在<map>头文件中。
映射:键→值,值 = 映射[键](似f:x → y,y = f(x))。即,可以通过映射,由键来快速定位值。
For Example:
Part of the code:
typedef std::map<char, CBitmapButtonEx* >KeyMap;
typedef std::map<char, CBitmapButtonEx* >::iteratorKeyMapIter;
private:
KeyMap mKeyMap;
void CSTKeyboard::InitMap()
{
mKeyMap[ 'A' ] = &m_btnAT;
mKeyMap[ 'B' ] = &m_btnBT;
mKeyMap[ 'C' ] = &m_btnCT;
mKeyMap[ 'D' ] = &m_btnDT;
mKeyMap[ 'E' ] = &m_btnET;
mKeyMap[ 'F' ] = &m_btnFT;
mKeyMap[ 'G' ] = &m_btnGT;
mKeyMap[ 'H' ] = &m_btnHT;
mKeyMap[ 'I' ] = &m_btnIT;
mKeyMap[ 'J' ] = &m_btnJT;
mKeyMap[ 'K' ] = &m_btnKT;
mKeyMap[ 'L' ] = &m_btnLT;
mKeyMap[ 'M' ] = &m_btnMT;
mKeyMap[ 'N' ] = &m_btnNT;
}
void CSTKeyboard::HideAllBtn()
{
for ( KeyMapIter pIter = mKeyMap.begin(); pIter != mKeyMap.end(); ++pIter )
{
if ( pIter->second )
{
pIter->second->ShowWindow( FALSE );
}
}
}
为了显示映射的威力,我们举一个单词计数程序的例子:(此处的单词是以白空符分隔的广义字符串
完整代码:
#include < iostream >
#include < fstream >
#include < map >
#include < string >
using namespace std ;
int main ( int argc , char* argv [ ] ) {
typedef map < string , int > WordMap ; // 定义特定的单词映射类型
typedef WordMap :: iterator wmIter ; // 定义该类型的迭代器
const char* fname = "WordCount.cpp" ; // 缺省文件名串
if ( argc > 1 ) fname = argv [ 1 ] ; // 读入命令行的第一个参数,作为文件名路径串
ifstream in ( fname ) ; // 打开文件输入流
if ( ! in ) { // 如果打开错误,则显示提示信息后退出
cout << " Open file " << fname << " error ! " << endl ;
return 1 ;
}
WordMap wordmap ; // 定义单词映射对象
string word ; // 定义单词字符串对象
while ( in >> word ) wordmap [ word ] ++ ; // 从文件中读入单词,
// 在wordmap [ word ]第一次出现时,
// 将单词word与其映射值wordmap之对偶元素(word,wordmap)
// 加入容器,并将映射wordmap的值加一(初值为0)。
// 遍历容器,显示输出计数大于等于3的单词和计数
for ( wmIter w = wordmap . begin ( ) ; w != wordmap . end ( ) ; w ++ )
if ( w->second >= 3 ) cout << w->first << " : " << w->second << endl ;
// 显示单词串“wordmap”的计数值
// cout << " wordmap : " << wordmap [ "wordmap" ] << endl ;
return 0 ;
}
此例中,“值 = 映射[键]”对应于“计数 = 映射[单词]”,即“count = wordmap [ word ]”。因为map容器中的内容是按键从小到大顺序排列的,所以在wordmap容器中的映射元素(即键值对<word, count>)是按单词的ASCII码字典顺序排列的。
程序中的 wordmap[word]++ ; 对(将int与word关联在一起的映射值)表达式进行增1操作。如果映射中没有单词word,则作为该单词的键-值对(此时的值被初始化为0),就会被自动加入到映射中(这是map容器所具有的零初始化能力);如果word已经在映射中,则该表达式会将键所对应的值加1。
你也可以用下面的语句,来单独显示某个单词键(例如单词字符串“wordmap”)的计数值:
cout << " wordmap : " << wordmap [ "wordmap" ] << endl ;
运行结果: