《C++Primer》复习——with C++11 [4]

news/2024/7/20 15:51:55 标签: c/c++, 内存管理, 数据结构与算法

考虑到STL的掌握主要靠的是练习,所以对于STL这部分,我把书中的练习都做一遍,加深印象。这些练习是第9、10、11、17章的,分别是顺序容器、泛型算法和关联容器等。

                                          ——10月22日

/*------------------------------------------------------------------------------------------------------------*/

STL中的顺序容器:vector--deque--list--forward_list--array--string

除了固定大小的array外,其他容器都提供高效、灵活的内存管理——添加删除更改访问元素、扩张收缩容器大小。string和vector支持快速的随机访问,但是其增删元素却会很耗时:在一次出入或删除操作后,需要移动插入和删除位置之后的所有元素,来保持连续的存储,而且,添加一个元素有事可能还要分配额外的存储空间。list和forward_list设计目的是另容器任何位置的添加和删除操作都很快速,作为代价,这两个容器不支持元素的随机访问,为了访问一个元素,必须便利整个容器,而且,与vector、deque和array相比,这两个容器的额外内存开销也很大。与string和vector类似,deque支持快速的随机访问,deque中间位置添加或删除元素的代价可能很高,但是在deque的两端添加或删除元素都是很快的,与list或forwa_list的添加删除元素的速度相当。forward_list和array是新C++标准增加的类型,与内置数组相比,array是一种更安全、更容易使用的数组类型。

确定使用容器的原则:

*除非你有很好的理由选择其他容器,否则使用vector

*如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list

*如果程序要求随机访问元素,应使用vector或deque

*如果程序要求在中间插入或删除元素,应使用list或forward_list

*如果程序要求在头围位置插入或删除元素,但不会在中间位置进行插入或删除操作,则使用deque

*如果程序只有在读取输入使才需要在容器中间位置插入元素,随后需要随机访问元素,则——首先,确定是否真的需要在容器中间位置添加元素,处理输入数据时,通常可以很容易的像vector追加元素,然后再调用标准库的sort函数来重拍容器中的元素,从而避免在中间位置添加元素。如果必须在中间插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到一个vector中。

如果程序即要求随机访问也要求在中间插入元素,取决于实际使用的相对性能,中间插入多的就list或forward_list,两端插入多的酒vector和deque。

/*-------------------------------------------习题start-------------------------------------------------*/

练习9.1:对于下面的程序任务,vector、deque和list哪种容器最为适合?解释你的选择理由,如果没有哪一种容器优于其他容器,也请解释理由。 a.读取固定数量的单词,讲他们按照字典顺序插入到容器中。b.读取未知数量的单词,总是讲新单词插入到末尾,删除操作在头部进行。c.从一个文件读取未知数量的整数,讲这些数排序,然后将他们打印到标准输出。1.list或者forward_lis,因为要按照字典顺序所以很大可能涉及到中间的插入,所以不用vector和deuqe 2.deque无疑,deque支持头尾的插入和删除,不在中间插入删除元素就不用list或forward_list可以节省空间。3.这些整数小而杂,应该使用数组类型的支持随机访问的容器,且要求排序,链表类容器的排序相对浪费时间和存储空间,所以使用vector或者deque。

/*--------------------------------------------习题end----------------------------------------------*/

                        今天写复习笔记优点浪费了时间,所以没写完这个-------10月25日        

练习9.2定义一个list对象,其元素类型是int的deque。list<deque<int>> mylist;

练习9.3构成迭代器范围的迭代器有何限制?两个迭代器分别指向同一个容器中的元素或者尾元素之后的位置。

练习9.4编写函数,接受一对指向vector<int>的迭代器和一个int 值,在两个迭代器指定的范围中查找给定的值,返回一个布尔值指出是否找到。

1 bool findvar(vector<int>::iterator first, vector<int>::iterator last, int var)
2 {
3     for (vector<int>::iterator it = first; it != last; ++it)
4     {
5         if (*it == var)
6             return true;
7     }
8     return false;
9 }

练习9.5重写上一题的函数,返回一个迭代器指向找到的元素。注意,程序必须处理未找到给定值的情况。

 1 typedef vector<int>::iterator vit;
 2 vit findvar(vit first, vit last, int var)
 3 {
 4     for (vit it = first; it != last; ++it)
 5     {
 6         if (*it == var)
 7             return it;
 8     }
 9     return last;
10 }

练习9.6下面程序有何错误?如何改正?

1 list<int> lst1;
2 list<int>::iterator iter1 = lst1.begin(), iter2 = lst1.end();
3 while (iter1 < iter2)
4     /*...*/
5 iter1 != iter2, iter1++

练习9.7为了索引int的vector中的元素,应该使用什么类型?

这个使用普通的const_iterator即可。

练习9.8为了读取string的list中的元素,应该使用什么类型?如果写入list,又应该使用什么类型?

为了读取而并不改变则使用const_iterator,若要写入则需要iterator类型。

练习9.9begin和cbegin两个函数有什么不同?

begin返回的是一个一般性的iterator,而cbegin返回的是一个const_iterator。

练习9.10下面4个对象分别是什么类型?

1 vector<int>    v1;    
2 const vector<int>  v2;
3 auto it1 = v1.begin(), it2 = v2.begin();
4 auto it3 = v1.cbegin(), it4 = v2.cbegin(); 

 

转载于:https://www.cnblogs.com/changme/p/4046644.html


http://www.niftyadmin.cn/n/1680402.html

相关文章

excel进销存管理系统_不用再花钱买软件做进销存,这份免费的Excel系统送你,财务收...

很多朋友&#xff0c;小店使用软件又不会操作&#xff0c;EXCEL很好解决了这个问题。使用方便&#xff0c;操作简单。只要能打字就能用。小编专注于EXCEL进销存管理系统的收集&#xff0c;终于经过3个月收集了6套不同风格的版本系统&#xff0c;此版本是docer excel进销存管理系…

程序员必备技能----断点调试(IDEA版)

程序员必备技能----断点调试&#xff08;IDEA版&#xff09;1. 一个实际需求2. 断点调试介绍3. 断点调试的快捷键4. 案例1. Debug01 -- 查看变量的变化2. Debug02 -- 查看数组越界3. Debug03 -- 如何追溯源码4. Debug04 -- 如何执行到下一断点代码链接&#xff1a;https://down…

python配置pyqt5_Python编程:Python3+PyCharm+PyQt5开发环境详细配置,建议收藏

前两天发布了个一个小视频&#xff0c;详细介绍了PyCharm开发环境下使用PyQt5界面库进行Python开发的详细配置过程&#xff0c;应小伙伴们的强烈要求&#xff0c;这次把文字版内容给大家整理出来了&#xff0c;大家喜欢的话快快收藏吧。 Python PyQt PyCharm 架构编程简介 先…

编写代码:ATM的登陆界面(用户验证、主菜单的选择) 查询-- 存款-- 取款-- 退出...

#include <stdio.h>#include <windows.h>int main (void){ int password,one,two,money11000000,money2999999,a0;//a为取的金额 money1为人命币 money2 为美元 printf("请输入您的密码&#xff1a;\n"); scanf("%d",&passwor…

Java 第一阶段建立编程思想 【零钱通(OOP)】

Java 第一阶段建立编程思想 【零钱通&#xff08;OOP&#xff09;】1. 项目需求说明2. 项目界面1. 完成显示菜单2. 完成零钱通明细3. 完成收益入账4. 完成消费5. 完成退出3. 项目改进代码链接&#xff1a;https://download.csdn.net/download/qq_52354698/86248562?spm1001.20…

linux mycnf字符集,mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项

mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项选项配置配置文件路径&#xff1a;/full/path/mysql/bin/my.cnf(默认为/etc/my.cnf)[client]default-character-setutf8[mysql]default-character-setutf8[mysqld]init_connectSET collation_connection utf8_unicode_ci…

java 反射机制_基础篇:深入解析JAVA反射机制

反射的概念java的放射机制&#xff1a;在程序运行时&#xff0c;程序有能力获取一个类的所有方法和属性&#xff1b;并且对于任意一个对象&#xff0c;可以调用它的任意方法或者获取其属性通俗解析&#xff1a;java文件需要编译成.class文件才能被jvm加载使用,对象的.class数据…

如何成为一名云架构师

不同于一年前&#xff0c;OpenStack 的职位以及工作机会都有很大扩展。之前&#xff0c;Python开发和基础架构师占据主导地位&#xff0c;如今对软件工程师和 DevOps 专家也有强烈的需求。为何 OpenStack 是开启IT职业生涯的最合适的方式。但是&#xff0c;它的价值在哪里&…