第5章心得 使用顺序容器和分析字符串 Accelerate C++ 学习笔记11

1 标准库

标准库不仅能够提供有用的数据结构和函数,还能反映一个具有一致性的体系结构,一旦了解了一种容器的特性,就可以非常轻松的掌握全部库容器的使用方法。

1.1 随机存取和顺序存取

随机存取容器,如vector、string、map就是,比如可以使用A[i]来访问A中的一个元素。
顺序存取容器,如list、set,会进制对它的元素进行随机访问,只能使用迭代器来顺序访问。

1.2 向量vector和表list

vector只在尾部增长或缩小,那向量的性能会非常好。

但是如果在内部插入或删除元素,为了保持快速随机存取的特性,就必须移动位于被插入或删除元素后面的全部元素。这就意味着,所耗费的运行时间会跟向量元素个数的二次方成比列。

但我们可以使用另一个数据结构list,它支持在容器中的任何位置插入和删除元素,不过不支持使用索引的随机访问。

如果给vector添加或删除元素会使得元素后面的迭代器出现失效的情况,而对于list添加或删除(push_back或erase)不会使得指向其他元素的迭代器失效。

对于一个删除容器内部的值的测试:

文件大小listvector
7350.10.1
73500.86.7
735008.8597.1

对于删除73500条记录的文件,list运行时间还不到9s,使用vector却用了几乎10分钟。

1.3 list排序

对于list类的迭代器不要不支持完全随机访问,因此不能使用标准库中的sort函数进行排序,而要使用list类自己提供的sort成员函数。

list<string> s;
s.sort(compare);

1.4 预分配vector的分配

v.reserve(n)
保留空间以保存n个元素,但不对这些元素进行初始化。这个操作不会改变容器的大小。它仅会影响向量对insert或push_back的充分调用而分配内存的频率。
v.resize(n)
给v个新长度,这长度等于n。如果n比v的当前长度小,那么,在这个向量中位于位置n之后的元素会被删除掉。如果n比当前长度大,那新的元素会被添加到向量中,而且这些元素会被初始化成与v的元素类型相应的值。

2 迭代器

2.1

  • 一个迭代器为一个值,
    • 它能够识别容器以及容器中的一个元素;
    • 允许我们检查存储在这个元素中的值;
    • 提供操作以移动在容器中的元素;
    • 采用对应容器所能够有效处理的方式对可用的操作进行约束。

2.2

每个标准容器都定义了两种相关的迭代器类型:

container-type::const_iterator
container-type::iterator 

其中container-type为容器类型,如vector<string>,它包括容器元素的类型。

2.3

可以将iterator类型转为const_iterator,但却不能将 const_iterator转换为iterator。

2.4

const_iterator一般用于仅需读取的操作;
iterator类型用于想使用迭代器修改存储在容器中的值。

2.5

erase会返回一个迭代器,这个迭代器指向紧跟刚刚删除掉元素的后面一个元素。

2.6

    for (vector<string>::const_iterator it = bottom.begin(); it != bottom.end() ; ++it) {
       ret.push_back(*it);
    }   

作用同上:

 ret.insert(ret.end(), bottom.begin(), bottom.end());

使用头文件<algorithm>的中copy:

std::copy(bottom.begin(), bottom.end(), back_inserter(ret));

back_inserter:为迭代器适配器(头文件<iterator>中定义)

2.7

*it
间接引用迭代器it以获得存储在容器中位于it所指示的位置的值。
这个操作经常于“.”结合起来获取类对象的一个成员。
例如(*it).x产生由迭代器it所指示的对象的一个成员。*的优先级比.低,而跟++和–相同。

it->x
与(*it).x等价,它返回间接调用迭代器it而获得的对象所指示的成员。

3 容器

  • 1
    c.rend()
    对于允许以逆序访问的其元素的容器,
    c.rbegin():表示指向容器中最后一个元素的迭代器;
    c.rend():表示指向容器中第一个元素之前的那个位置的迭代器。
  • 2
    container<T>c;
    container<T> c(c2);
    定一个容器c,如果给定c2,那么c是c2的一个副本;否则c为空。
  • 2
    container<T> c(n) ;
    定一个有n个容器的c。
    container<T> c(n,t) ;
    定义一个有n个元素的容器c,n的元素是t的副本。
    container<T> c(b,e)
    创建一个容器,这个容器保存了位于区间[b,e)中的迭代器所知元素的值。

3 <cctype>头文件

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星蓝雨

如果觉得文章不错,可以请喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值