###学习《C++ Primer》- 4

点击查看Evernote原文

#@author:       gr
#@date:         2014-10-16
#@email:        forgerui@gmail.com

Part 4: STL关联容器(第11章)

一、pair类型

pair类型的数据成员是public的,两个成员分别命名为first, second

#下面两种造价
pair<string, string> p(v1, v2);
pair<string, string> p = {v1, v2};
#使用make_pair构造
make_pair(v.back(), v.back().size());

二、容器关键字

对于set类型,key_typevalue_type是一致的。在map中,value_typepair类型的,key_type是键类型,mapped_type是值的类型。

set<string>::value_type v1;         //v1是一个string
set<string>::key_type v2;           //v2是一个string
map<string, int>::value_type v3;    //v3是一个pair<string, int>
map<string, int>::key_type v4;      //v4是一个string
map<string, int>::mapped_type v5;   //v5是一个int

三、关联容器迭代器

mapvalue_type类型是一个pair类型,其first成员是const的,second是成员保存值。
set关键字也是const的,可以用set迭代器读取其值,但不能修改

四、添加元素

word_count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1));
word_count.insert(map<string, size_t>::value_type(word, 1));

mapinsert的返回值是个pair类型,first代表迭代器,secondbool类型,表示是否插入成功,成功返回true

//返回值是个pair类型
pair< map<string, size_t>::iterator, bool> ret = word_cout.insert({word, 1});
cout<< ret.first->second << endl;

multimapinsert只会返回迭代器,因为它的插入总是成功的。

五、删除元素

三种erase,一种是传递迭代器,返回void;第二种是传递一组迭代器表示一个范围,erase(b, e);,返回e;第三种是传递一个key_type参数,删除匹配的关键字,返回删除元素的数量。

六、map的下标操作

set不支持下标操作。multimap也没有,因为可能有多个匹配项。

下标操作如果存在会获取关联的值,如果不存在会自动创建该值插入到map中。所以不能使用下标判断元素是否存在

七、使用find查找元素

find接受一个key_value类型值,返回一个迭代器。

c.find(k);
if (word_count.find("hello") == word_count.end())
    cout << "the element is not in the map" << endl;

还可以使用cout查找元素个数。
multimapmultiset中查找元素。

string item = "Lee Seng";
auto entries = autors.count(item);
auto iter = authors.find(item);
while (entries){
    cout << iter->second << endl;
    ++iter;
    --entries;
}

lower_bound(k)返回第一个关键字不小于k的元素,同理upper_bound()返回第一个关键字大于k的元素。

for (auto beg = authors.lower_bound(item),
        end = authors.upper_bound(item); beg != end; ++beg)
{
    cout << beg->second << endl;        
}

equal_range整合了lower_boundupper_bound,返回一个pair,firstlower_bound的结果,secondupper_bound的结果。

for (auto range = authors.equal_range(item); range.first != range.second; ++range.first)
{
    cout << range.first->second << endl;
}

八、无序容器

新标准定义了4个无序关联容器,分别在基础的容器前加上unordered_,分别是unordered_map, unordered_multimap, unordered_setunordered_multiset。它们不使用比较运算符而使用哈希函数来组织元素。

定义自己的hash函数==运算符

//hash函数
size_t hasher(const Sales_data& sd){
    return hash<string>()(sd.isbn());
}
//==运算符
bool eqOp(const Sales_data& lhs, const Sales_data& rhs){
    return lhs.isbn() == rhs.isbn();
}
//定义一个unordered_multiset类型别名
using SD_multiset = unordered_multiset(Sales_data, decltype(hasher)*, decltyhpe(eqOp)*);
SD_multiset bookstore(42, hasher, eqOp);
posted @ 2014-11-28 15:54  bairuiworld  阅读(175)  评论(0编辑  收藏  举报