stl关联容器

stl关联容器

  • 总共有8个关联容器,体现在三个不同的纬度上:
    1)是一个map,还是一个set
    2)是否允许重复的关键字
    3)是否需要按照顺序保存

使用关联容器

map<string,size_t> word_count;//string到size_t的空map
string word;
while(cin>>word)
    ++word_count[word];//提取word的计数器并将其加1
for(const auto &w : word_count)//对map中的每个元素
    cout<<w.first<<" occurs "<<w.second
        << ((w.second > 1)?"times":"time") <<endl;
  • 使用下标运算符时,如果不存在,则创建一个新的元素,值初始化
map<string,size_t> word_count;
set<string> excludes = {"The","But","And","Or","An","A"};

string word;
while(cin>>word)
    if(excludes.find(word) == exclude.end())
        ++word_count[word];

定义关联容器

map<string,size_t> word_count;//空容器
//列表初始化
set<string> excludes = {"The","But","And","Or","An","A"};
//三个元素;authors将映射为名
map<string,string> authors = {{"Joyce","James"}};

关键字类型的限制

  • “行为正常”的<运算符的要求
    1. 两个关键字不能够同时“小于等于”对方
    2. 如果k1“小于等于”k2,且k2“小于等于”k3,则k1“小于等于”k3
    3. 如果两个关键字均不“小于等于”对方,则两者等价
  • 比较操作也是容器类型的一部分
multiset<Sales_data,decltype(compareIsbn)*> bookstore(compareIsbn);

pair类型

  • pair上的操作
pair<T1,T2> p;//p是一个pair,两个类型分别为T1和T2的成员都进行了值初始化
pair<T1,T2> p(v1,v2);//p是一个成员类型为T1和T2的pair,first和second分别使用v1和v2初始化
pair<T1,T2> p = {v1,v2};
make_pair(v1,v2);//返回一个用v1,v2初始化的pair,类型由v1和v2推断

关联容器操作

  • pair的关键字是const的,我们可以改变pair的值,但是无法改变关键字成员的值
auto map_it = word_count.begin();
//*map_it是指向pair<const string,size_t>对象的引用
cout<<map_it->first;
cout<<" "<<map_it->second;
map_it->first = "new key";//错误!!!,first是const的
++map_it->second;//正确
  • set的迭代器是const的

遍历迭代器

auto map_it = word_count.cbegin();
while(map_it!=word_count.cend()){
    cout<<map_it->first<<" occurs "<<map_it->second <<" times "<<endl;
    ++map_it;
}

添加元素

map<string,size_t> word_count;//从string到size_t的空map
string word;
while(cin>>word){
    //插入一个元素,关键字等于word,值为1
    auto ret = word_count.insert({word,1});
    if(!ret.second)//word已经在word_count中
        ++ret.first->second;
}
  • 如果是multimap类型,insert函数返回是指向新元素的迭代器,无需返回bool值

删除元素

  • 有三种erase方法可以调用
    1. c.erase(k)
      从c中删除每个关键字为k的元素。返回一个size_type值,指出删除元素的数量
    2. c.erase(p)
      从c中删除迭代器p指向的元素
    3. c.erase(b,e)
      从c中删除迭代器对b和e所表示的范围中的元素。返回e

map的下表操作

  • 下标 VS at
    1. c[k] 返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化
    2. c.at(k) 若k不在c中,抛出一个out_of_range异常

访问元素

  • find / count
  • 对于有序容器来说,lower_bound / upper_bound
  • 在mutlimap和multiset中查找元素
string search_item("Alain de Botton");
auto entries = authors.count(search_item);
auto iter = authors.find(search_item);
while(entries){
    cout<<iter->second<<endl;
    ++iter;
    --entries;
}
for(auto pos = c.equal_range(search_item);pos.first!=pos.second;++pos.first)
    cout<<pos.first->second<<endl;

无序容器

  • 通常,无序容器和有序容器可以互相替换

无序容器对关键字类型的要求

  1. haser函数
  2. == 运算符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值