<C++Primer>第四版 阅读笔记 第二部分 “容器和算法”

泛型算法中,所谓“泛型(generic)”指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素


第九章 顺序容器

顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。


IO库类型不支持复制或赋值。因此,不能创建存放IO类型对象的容器。


定义容器的容器时,注意使用空格:

vector< vector<string> > lines;    OK

vector<vector<string>> lines;     ERROR


两个迭代器相加的操作是未定义的。


vector和deque容器提供了对元素的快速随机访问,但付出的代价是,在容器的任意位置插入或删除元素,比在容器尾部插入和删除的开销更大。list类型的任何位置都能快速插入和删除,但付出的代价是元素的随机访问开销较大。

在list容器的元素之间移动的唯一方法是顺序跟随指针。


string类型与vector容器不同的是,它不支持以栈方式操纵容器:在string类型中不能使用front、back和pop_back操作。


第十章 关联容器

关联容器与顺序容器的区别:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。


关联容器支持通过键来高效地查找和读取元素。两个基本的关联容器类型是map和set。map的元素以键-值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。

一般来说,如果希望有效地存储不同值的集合,那么使用set容器比较合适,而map容器则更适用于需要存储(乃至修改)每个键所关联的值的情况。


关联容器不能通过容器大小来定义,因为这样的话就无法知道键所对应的值是什么。


对于键类型,唯一的约束就是必须支持 < 操作。


map<K,V>::value_type 一个pair类型,它的first元素具有constmap<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型。

在学习map的接口时,需谨记value_type是pair类型,它的值成员可以修改,但键成员不能修改


map迭代器进行解引用将产生pair类型的对象。


使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。


--------------------经典的小代码--------------------

// count number of times each word occurs in the input

map<string,int> word_count; //empty map from string to int

string word;

while (cin>>word)

++word_count[word];

--------------------经典的小代码--------------------


在添加新的map元素时,使用insert成员可避免使用下标操作符所带来的副作用:不必要的初始化。


map对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已在容器中,则insert将不做任何操作。


查找并读取map中的元素:如果希望当具有指定键的元素存在时,就获取该元素的引用,否则就不在容器中创建新的元素,那么应该使用find


set容器只是单纯的键的集合。set不支持下标操作符,而且没有定义mapped_type类型。与map一样,set容器存储的键也必须唯一,而且不能修改。


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


在multimap中,同一个键所关联的元素必然相邻存放。


第十一章 泛型算法

关键概念:泛型算法永不执行容器提供的操作


理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序


初学者常犯的错误:在没有元素的空容器上调用fill_n函数(或者类似的写元素算法)


流迭代器的限制

1、不可能从ostream_iterator对象读入,也不可能写到istream_iterator对象中。

2、一旦给ostream_iterator对象赋了一个值,写入就提交了。赋值后,没有办法在改变这个值。此外,ostream_iterator对象中每个不同的值都只能正好输出一次。

3、ostream_iterator没有->操作符。


标准库定义了五种迭代器类型:输入、输出、前向、双向和随机访问迭代器。


算法从不直接改变它所操纵的序列的大小。(如果算法的实参是插入迭代器,则该迭代器会添加新元素,但算法并不直接这么做。)

待继续····

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值