set不支持下标操作符,没有定义mapped_type类型,在set容器中value_type不是pair类型,而是与key_type相同的类型,与map一样,set容器存储的键也必须唯一,而且不能修改。
在set中添加元素:set
set不支持下标操作符,从set中获取元素可使用find运算,如果只需判断某个元素是否存在,可使用count运算(返回值只能是1或者0)。
set中的键也为const,在获得指向set中某元素的迭代器后,只能对其做读操作,而不能做写操作。
set
*ser_it = 11; //错误 cout << *ser_it < multimap和multiset类型与相应的单元素版本具有相同的头文件定义:分别是map和set。 添加: //一个键可对应多个值 authors.insert(make_pair(string(“Birth,John”), string(“Sot-weed Factor”))); authors.insert(make_pair(string(“Birth,John”), string(“Lost in the Funhouse”))); 删除: multimap multimap 2 使用lower_bound和upper_bound见35 返回迭代器的关联容器操作 m.lower_bound(k) m.upper_bound(k) m.equal_range(k) //适用于所有关联容器 在同一个键上调用lower_bound和lower_bound,将产生一个迭代器范围,指示出该键所关联的所有元素,如果该键在容器中存在,则会获得两个不同的迭代器:lower_bound返回的迭代器指向该键关联的第一个实例,而lower_bound返回的迭代器则指向最后一个实例的下一个位置,如果该值不在multimap中,这两个操作将返回同一个迭代器,指向依据元素的排列顺序该键应该插入的位置。 3 使用equal_range函数 equal_range函数返回存储一对迭代器的pair对象,如果该值存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置,如果找不到匹配的元素,则pair对象中的两个迭代器都指向该键应该插入的位置。 pair pos = anthors.equal_range(serch_item); while (pos.first != pos.second){ cout << pos.first->second << endl; ++pos.first;} 第十一章 泛型算法 使用泛型算法必须包含algorithm头文件:#include 使用泛化的算术算法必须包含numeric头文件:#include accumulate,该算法在numeric头文件中定义。 int sum = accumulate (vec.begin(), vec.end(), 42); //sum为vec的元素之和再加上42 accumulate带有三个形参,前两个形参指定要累加的元素范围,第三个形参则是累加的初值。返回类型就是第三个实参的类型。 ind_first_of函数的使用 见 36 find_first_of的使用 写容器元素的算法: 写入到输入序列的一个简单算法是fill函数:带有一对迭代器形参,用于指定要写入的范围,所写的值是它的第三个副本。 fill (vec.begin, vec.end(), 0); //每个元素都是0 fill (vec.begin(), vec.begin() + vec.end/2, 10); 不检查写入操作的算法:fill_n,该函数参数包括:一个迭代器,一个计数器,一个值,该函数从迭代器指向的元素开始,将指定数量的元素设置为给定的值。fill_n函数假定对指定的元素做写操作是安全的,初学者常犯的错误是:在没有元素的空容器上调用fill_n函数,如: vector fill_n (vec.begin(), 10, 0); //可能导致严重的运行时错误 对指定数目的元素做写入运算,或者写到目标迭代器的算法,都不检查目标的大小是否足以存储要写入的元素。 back_inserter: 确保算法有足够的元素存储输出数据的一种方法是使用插入迭代器。插入迭代器是可以给基础容器添加元素的迭代器。通常,用迭代器给容器元素赋值时,被赋值的是迭代器所指向的元素,而使用插入迭代器赋值时,则会在容器中添加一个新元素,其值等于赋值运算的右操作数的值。 使用back_inserter函数时,需要包含iterator头文件。 vector fill_n (back_inserter(vec), 10, 0); //效果相当于在vec上调用push_back,在vec末尾添加10个元素,每个元素的值都是0。 写入到目标迭代器的算法:最简单的是copy函数 vector copy (ilist.begin(), ilist.end(), back_inserter(ivec)); //copy从输入范围中读取元素,然后将它们复制给目标ivec replace算法:对输入序列做读写操作,将序列中特定的值替换为新的值,该算法带有四个参数:一对指定输入范围的迭代器和两个值,每一个等于第一个值的元素替换为第二个值。 replace(ilist.begin(), ilist.end(), 0, 32); //将所有值为0的实例替换为32 如果不想改变原来的序列,则调用replace_copy,这个算法接受三个迭代器实参,指定保存调整后序列的目标位置。 vector replace_copy (ilist.begin(), ilist.end(), back_inserter(ivec), 0, 32); 算法不直接修改容器的大小,如果需要添加或删除元素,则必须使用容器操作。 排序算法:sort, stable_sort-----保留相等元素的原始相对位置 插入迭代器:c++提供了三种插入器,其差别在于插入元素的位置不同: back_inserter:创建使用push_back实现插入的迭代器 front_inserter:使用push_front实现插入 inserter:使用insert实现插入操作,除了所关联的容器外,insert还带有第二个实参:指向插入起始位置的迭代器。 只有当容器提供push_front操作时,才能使用front_inserter。 list replace_copy (ivec.begin(), ivec.end(), inserter (ilist, it), 100, 0); iostream迭代器:istream_iterator用于读取输入流 ostream_iterator则用于写输出流 iostream迭代器的构造函数 见 40 iostream迭代器的构造函数 istream_iterator ostream_iteratot ostream_iterator 41 istream_iterator的操作 见 41 istream_iterator的操作