C++ 关联容器

1、map为关联容器,其元素以键值对的形式存放
map对象的定义:
map<k,v> m;  创建一个名为m的空map对象
map<k,v> m(m2); 创建m2的副本m

map<k,v> m(b,e);  存储迭代器b至e范围内的所有副本,该元素类型必须能转换为pair<const key,value>形式


2、用下标访问map对象
使用下标访问map和使用下标访问vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。

/**
 *  计算读入的每个单词的个数
 */
int main(int argc,char **argv)
{
    string words;
    map<string,int> word_count;
    while(cin>>words){
        if(words == "c"){ //输入c则退出循环
            break;
        }
        ++word_count[words];//第一次出现则往map容器中添加新元素,同时将其值初始化为0,然后其值立即加1
    }

    map<string,int>::iterator map_iter = word_count.begin();  //开始迭代输出
    while(map_iter != word_count.end()){
        cout<<map_iter->first<<" "<<map_iter->second<<endl;
        map_iter++;
    }
    return 0;
}



3、map插入元素
m.insert(e) e是一个用在m上的value_type类型的值。如果e不在m中,则插入;如果e存在,则保持m不变。返回一个pair对象,包含一个指向键的map迭代器和bool值,表示是否插入了该元素。
m.insert(b,e)  对于该范围内的所有元素,只有当它的键在m中不存在时,才插入。返回void
m.insert(iter,e)  以iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。

 

/**
 *  计算读入的每个单词的个数,使用insert成员可以带来不必要的初始化
 */
int main(int argc,char **argv)
{
    string words;
    map<string,int> word_count;
    typedef map<string,int>::value_type valType;
    while(cin>>words){
        if(words == "c"){ //输入c则退出循环
            break;
        }
        pair<map<string,int>::iterator, bool> ret = word_count.insert(valType(words,1));//对于每个单词都尝试insert,并将初值赋为1
        if(!ret.second){//如果没有插入成功,说明单词已经存在了
            ret.first->second++;//返回的迭代器执行给定键的元素(无论是否插入)
        }
    }

    map<string,int>::iterator map_iter = word_count.begin();  //开始迭代输出
    while(map_iter != word_count.end()){
        cout<<map_iter->first<<" "<<map_iter->second<<endl;
        map_iter++;
    }
    return 0;
}



4、查找并读取map中的元素
m.count(k)   返回m中k的出现次数
m.find(k) 如果存在,返回指向该元素的迭代器,否则,返回超出末端的迭代器,即.end();

5、map元素的删除
erase(k) 删除指定键的元素,返回size_type,表示删除元素的个数。 0 or 1
erase(p) 删除迭代器所指向的元素,返回void
erase(b,e)

6、multimap

string i_to_s(int i)
{
    char buf[10];
    sprintf(buf,"%d",i);
    string s=buf;
    return s;
}
string i_to_s_2(int i)
{
    string s;
    strstream ss;
    ss << i;
    ss >> s;
    return s;
}
int main(int argc,char **argv)
{
    multimap<string,string> m;
    typedef multimap<string,string>::size_type sizeType;
    for(sizeType i=0;i<10;i++){
        m.insert(make_pair("zf","book"+i_to_s_2(i)));
        m.insert(make_pair("yj","book"+i_to_s_2(i)));
    }
    /*
    string name("zf");
    sizeType cnt = m.count(name);
    cout<<"count= "<<cnt<<endl;
    multimap<string,string>::iterator map_iter = m.find(name);
    for(sizeType i= 0; i != cnt; i++ )
    {
        cout<<map_iter->first<<"  "<<map_iter->second<<endl;
        ++map_iter;
    }
    */
    string name("yj");
    typedef map<string,string>::iterator it;
    it beg = m.lower_bound(name);
    it end = m.upper_bound(name);
    while( beg != end){
        cout<<beg->first<<" "<<beg->second<<endl;
        beg++;
    }
    return 0;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值