吐血共享C++ primer(第四版)学习笔记 - 图文(6)

2019-08-30 22:05

set不支持下标操作符,没有定义mapped_type类型,在set容器中value_type不是pair类型,而是与key_type相同的类型,与map一样,set容器存储的键也必须唯一,而且不能修改。

在set中添加元素:set set1; set1.insert(“the”); set1.insert(“and”); set iset2; iset2.insert(ivec.begin(), ivec.end());

set不支持下标操作符,从set中获取元素可使用find运算,如果只需判断某个元素是否存在,可使用count运算(返回值只能是1或者0)。

set中的键也为const,在获得指向set中某元素的迭代器后,只能对其做读操作,而不能做写操作。

set::iterator ser_it = iset.find(1);

*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 author; string serch_item (“Kazuo Ishiguro”);

multimap::size_type cnt = author.erase(serch_item); 在multimap中和multiset中,如果某个键对应多个实例,则这些实例在容器中将相邻存放。 在multimap中和multiset中查找元素: 1 使用find和count操作

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 vec;

fill_n (vec.begin(), 10, 0); //可能导致严重的运行时错误 对指定数目的元素做写入运算,或者写到目标迭代器的算法,都不检查目标的大小是否足以存储要写入的元素。 back_inserter:

确保算法有足够的元素存储输出数据的一种方法是使用插入迭代器。插入迭代器是可以给基础容器添加元素的迭代器。通常,用迭代器给容器元素赋值时,被赋值的是迭代器所指向的元素,而使用插入迭代器赋值时,则会在容器中添加一个新元素,其值等于赋值运算的右操作数的值。

使用back_inserter函数时,需要包含iterator头文件。 vector vec;

fill_n (back_inserter(vec), 10, 0); //效果相当于在vec上调用push_back,在vec末尾添加10个元素,每个元素的值都是0。

写入到目标迭代器的算法:最简单的是copy函数 vector ivec;

copy (ilist.begin(), ilist.end(), back_inserter(ivec));

//copy从输入范围中读取元素,然后将它们复制给目标ivec

replace算法:对输入序列做读写操作,将序列中特定的值替换为新的值,该算法带有四个参数:一对指定输入范围的迭代器和两个值,每一个等于第一个值的元素替换为第二个值。 replace(ilist.begin(), ilist.end(), 0, 32); //将所有值为0的实例替换为32

如果不想改变原来的序列,则调用replace_copy,这个算法接受三个迭代器实参,指定保存调整后序列的目标位置。 vector ivec;

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::iterator it = find (ilist.begin(), ilist.end(), 42);

replace_copy (ivec.begin(), ivec.end(), inserter (ilist, it), 100, 0);

iostream迭代器:istream_iterator用于读取输入流 ostream_iterator则用于写输出流 iostream迭代器的构造函数 见 40 iostream迭代器的构造函数

istream_iterator in(strm) istream_iterator in;

ostream_iteratot in(strm);

ostream_iterator in(strm, delim);

41 istream_iterator的操作 见 41 istream_iterator的操作


吐血共享C++ primer(第四版)学习笔记 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电子测量自测题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: