myset.find(target)==myset.end();
myset.count(target)==0;
对于有序容器(map,multimap,set,multiset),关键字类型必须定义元素比较的方法,默认情况下,标准库使用关键字类型的<运算符来比较两个关键字 ;
当关联容器的元素为自定义的类类型时,我们应该定义一个比较函数,这时候在关联容器的元素类型尖括号里必须提供两个类型:关键字类型和比较操作类型(应该是一种函数指针类型),注意下例中使用decltype来指出要使用一个给定函数类型的指针。用compareIsbn来初始化bookstore对象,表示当我们向bookstore添加元素时,通过调用compareIsbn来为这些元素排序;
bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn()<rhs.isbn();
}
multiset<Sales_data, decltype(compareIsbn)*> bookstore(compareIsbn);
11.2 关联容器概述 pair类型的构造方法,功能操作,详见380页;练习11.12int main()
{
vector<pair<string, int>> vec;
pair<string, int>temp;
while (cin >> temp.first >> temp.second)
{
vec.push_back(temp);
}
for (auto pir : vec)
{
cout << pir.first << " " << pir.second << endl;
}
return 0;
}
11.3 关联容器操作 当解引用一个关联容器迭代器时,会得到一个类型为容器的value_type的值的引用,三种关联容器的类型别名(key_type, mapped_type, value_type)适用的容器见381页;对于map而言,value_type是一个pair类型,其first成员保持const的关键字,second成员你保存值;;set的迭代器是const的,只允许读set的元素,map只能读key元素;当使用一个迭代器遍历一个map/multimap/set/multiset时,迭代器按照关键字升序遍历元素;关联容器通常不使用泛型算法,因为这类算法通常需要向元素写入值,而set类型中的元素是const的,map中的元素是pair,pair的第一个成员也是const的;实际编程中,如果真要对一个关联容器使用算法,要么是将它当做一个原序列(如使用copy),要么是当一个目的位置;关联容器通常使用insert函数进行插入操作,insert有两个版本,分别接受一对迭代器(a.begin(),a.end()),或者一个初始化列表({arg1,arg2});map进行insert时要记住元素的类型是pair,插入map的4种方法如下:mymap.insert({arg1,arg2});
mymap.insert(make_pair(arg1,arg2));
mymap.insert(pair<t1,t2>(arg1,arg2));
mymap.insert(map<t1,t2>::value_type(arg1,arg2))
insert(或emplace)返回的值依赖于容器类型和参数,对于不包含重复关键字的容器,添加单一元素的insert和emplace版本返回一个pair,first成员是一个迭代器指向具有给定关键字的元素,second成员是一个bool值指出元素是插入成功还是已经存在于容器中(false);
关联容器定义了三个版本的erase用来删除元素,与顺序容器类似,指定元素删除,函数返回void;一个额外的只有关联容器有的erase操作,接受一个Key_type参数,删除所有匹配给定关键字的元素(如果存在的话),返回实际删除的元素的数量;详细见387页;
对于multimap或者unordered_multimap不能进行下标操作,因为可能一个key对应多个value,map的下标运算符接受一个索引(即一个关键字)来获取与此关键字相关联的值;如果关键字并不在map中,会为它创造一个元素并插入到map中,关联值将进行值初始化;由于下标运算符可能插入一个新的元素,所以只可以对非const的map使用下标操作;
通常情况下,解引用一个迭代器所返回的类型与下标运算符返回的类型是一样的,但对map而言,下标操作返回一个mapped_type对象;解引用时返回一个value_type对象(pair);与其他下标运算符相同的是,map的下标运算符返回一个左值,既可读也可写;
multimap和multiset中使用lower_bound, upper_bound函数可以找到目标元素的范围,用法跟equal_range相同
11.4 无序容器 如果关键字类型固有就是无需的,或者性能测试发现问题可以用哈希技术解决,就可以使用无序容器(unordered_);无序容器在存储上组织为一组桶,每个桶保存另个或多个元素,无序容器使用一个哈希函数将元素映射到桶,无序容器的性能依赖于哈希函数的质量和桶的数量和大小;管理桶的重载hash函数和比较函数,详见396页;