目前在阿里巴巴搬砖
关联容器还定义了如下表所示的类型。这些类型表示容器关键字和值的类型。 关联容器额外的类型别名 key_type 此容器类型的关键字类型 mapped_type 每个关键字关联的类型;只适用于map value_type 对于set,与key_type相同 对于map,为pair 对于set类型,key_type和value_type是一样的;set中保存的值就是关键字。
关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 虽然关联容器的很多行为与顺序容器相同,但其不同之处反映了关键字的作用。
我们实现一个简单的文本查询程序。我们的程序允许用户在一个给定文件中查询单词,查询结果是单词在文件中出现的次数及所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。 #include #include #include #include #include #include #...
12.20 编写程序,逐行读入一个输入文件,将内容存入一个StrBlob中,用一个StrBlobPtr打印出StrBlob的每个元素。 StrBlob.h #ifndef STRBLOB_H #define STRBLOB_H #include #include #include ...
12.6 编写函数,返回一个动态分配的int的vector。将此vector传递给另一个函数,这个函数读取标准输入,将读入的值保存在vector元素中。再将vector传递给另一个函数,打印读入的值。记得在恰当的时刻delete vector。
11.20 使用insert代替下标操作。 #include #include #include #include using namespace std; int main() { map word_count; string word; while(cin>>word) { auto ret=word_count.
11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。 #include #include #include #include using namespace std; int main() { ...
11.4 编写单词计数程序,忽略大小写和标点。例如,“example.”,“example,"和”Example“应该递增相同的计算器。 #include #include #include #include using namespace std; int main() { ...
与其他容器不同,链表类型list与forward_list定义了几个成员函数形式的算法,如下表所示。特别是,它们定义了独有的sort、merge、remove、reverse和unique。通用版本的sort要求随机访问迭代器,因此不能用于list和forward_list,因为这两个类型分别提供双向迭代器和前向迭代器。
任何算法的最基本的特性是它要求其迭代器提供哪些操作。某些算法,如find,只要求通过迭代器访问元素、递增迭代器以及比较两个迭代器是否相等这些能力。其他一些算法,如sort,还要求读、写和随机访问元素的能力。
除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。 插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入元素 流迭代器:这些迭代器被绑定到输入或输出上,可用来遍历所有关联的IO流 反向迭代器:这些迭代器向后而不是向前移动。
对于那种只有一两个地方使用的简单操作,lambda表达式是最有用的。如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式。类似的,如果一个操作需要很多语句才能完成,通常使用函数更好。
很多算法都会比较输入序列中的元素。默认情况下,这类算法使用元素类型的
除了少数例外,标准库算法都对一个范围内的元素进行操作。我们将此元素范围称为“输入范围”。接受输入范围的算法总是使用前两个参数来表示此范围,两个参数分别是指想要处理的第一个元素和尾元素之后位置的迭代器。 虽然大多数算法遍历输入范围的方式相似,但它们使用范围中元素的方式不同。
顺序容器只定义了很少的操作:在多数情况下,我们可以添加和删除元素。访问首尾元素、确定容器是否为空以及获得指向首元素或尾元素之后位置的迭代器。 如果我们想要做:查找特定元素、替换或删除一个特定值、重排元素顺序等。
10.42 使用list的算法实现排序和删除重复元素。 #include #include #include #include using namespace std; void elimDup(list &words) { words.
10.29 编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里。 #include #include #include #include #include using namespace std; int main() { ifstream in("1.
10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值。 #include #include #include #include #include using namespace std; bool c...
10.21 编写一个lambda,捕获一个局部int变量,并递减变量值,直至它变为0.一旦变量变为0,再调用lambda应该不再递减变量。lambda应该返回一个bool值,指出捕获的变量是否为0. #include #include using namespace std; int...
编写程序,求大于等于一个给定长度的单词有多少。我们还会修改输出,使程序只打印大于等于给定长度的单词。 使用find_if实现的代码如下: #include #include #include #include using namespace std; void biggies(ve...
10.13 标准库定义了名为partition的算法,它接受一个谓词,对容器内容进行划分,使得谓词为true的值会排在容器的前半部分,而使谓词为false的值会排在后半部分。算法返回一个迭代器,指向最后一个使用谓词为true的元素之后的位置。
10.11编写程序,使用stable_sort和isShorter将传递给你的elimDups版本的vector排序。打印vector的内容。 #include #include #include #include using namespace std; void elimDup(vector &words) { //按字典序排列 sort(words.
void reserve (size_type n); reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化。reserve 的参数n是推荐预分配内存的大小,实际分配的可能等于或大于这个值,即n大于capacity的值,就会reallocate内存 capacity的值会大于或者等于n 。
容器类型上的操作形成了一种层次: 某些操作是所有容器类型都提供的,如下表所示 一般来说,每个容器都定义在一个头文件中,文件名与类型名相同。即,deque定义在头文件deque中,list定义在头文件list中,以此类推。
除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制。能使某种事物的行为看起来像另外一种事物一样。
除了顺序容器共有的操作之外,string类型还提供了一些额外的操作。这些操作中的大部分要么是提供string类和C风格字符数组之间的相互转换,要么是增加了允许我们用下标代替迭代器的版本。 构造string的其他方法 除了前面的介绍的关于string的操作http://www.
1 改变容器的大小 我们可以使用resize来增加或缩小容器,与往常一样,array不支持resize。如果当前大小大于所要求的大小,容器后面的元素会被删除;如果当前大小小于新大小,会将新元素添加到容器后部: list ilist(10,42); //10个int:每个的值都是42 ilist.
为了理解forward_list为什么有特殊版本的添加和删除操作,考虑当我们从一个单向链表中删除一个元素时会发生什么。当添加或删除一个元素时,删除或添加的元素之前的那个元素的后继会发生变化。为了添加或删除一个元素,我们需要访问其前驱,以便改变前驱改变前驱的链接。
顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系的到了元素如何存储、访问、添加以及删除。 向顺序容器中添加元素 除了array之外,所有标准库容器都提供灵活的内存管理。
每个容器类型都定义了一个默认构造函数。除array之外,其他容器的默认构造函数都会创建一个指定类型的空容器。且都能接受指定容器大小和元素初始值的参数。 容器定义和初始化(所以容器的初始化) C c; 默认构造函数。
与容器一样,迭代器有着公共的接口,如果一个迭代器提供某个操作,那么所有提供相同操作的迭代器对这个操作的实现方式都是相同的。例如,标准容器类型上的所有迭代器都允许我们访问容器中的元素,而所有迭代器都是通过解引用运算符来实现这个操作的。
9.52 使用stack对象处理带圆括号的表达式。遇到左圆括号时,将其标记下来。当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈。 接着在stack对象中压入一个值,用以表明这个用一对圆括号括起来的表达式已经被替换。
栈使用在括号匹配中的例子 程序如下: #include #include using namespace std; int main() { stack initStack; char ch; while(cin>>ch) { ...
9.51 设计一类,它又三个unsigned成员,分别表示年月日。为其编写构造函数,接受一个表示日期的string参数。 程序如下: #include #include using namespace std; class My_Date { public: My_D...
9.50 编写程序处理一个vector,其元素都表示整数型。计算vector中所有元素之和。修改程序,使之计算表示浮点值的string之和。 程序如下: #include #include #include using namespace std; int main() { ...
9.47 编写程序,首先查找string"ab2c3d7R4E6"中的每个数字字符,然后查找其中每个字母字符。编写两个版本的程序,第一个要使用find_first_of,第二个要使用find_first_not_of。
9.43 编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldval替换为newVal。测试程序,用它替换通用的简写形式,如,将“tho”替换为“though”,将“thru”替换为“through”。
9.28 编写函数,接受一个forward_list和两个string共三个参数。函数应在链表中查找第一个string,并将第二个string插入到紧接着第一个string之后的位置。若第一个string未在链表中,则将第二个string插入到链表末尾。
#include #include using namespace std; int main() { forward_list flst={0,1,2,3,4,5,6,7,8,9}; auto prev=flst.before_begin(); auto curr=flst.begin(); while(curr!=flst.end()) { if(*curr%2)//当找到奇数元素时,我们将prev传递给erase_after。
#include #include #include using namespace std; int main() { vector vec={0,1,1,2,3,5,8,21,55,89}; list li={0,1,1,2,3,5,8,21,55,89}; auto ve=vec.
std::vector::emplace_back C++ Containers library std::vector templatevoid emplace_back( Args&&.
一个容器就是一组特定类型对象的集合。顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。 顺序容器概述 下表列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。
假如有一个文件,列出了一些人和他们的电话号码。某些人只有一个号码,而另外一些人则有多个——家庭电话、工作电话、移动电话等。我们的输入文件看起来是这样的: morgan 2015552368 8625550123 drew 9735550130 lee 6095550132 2015550175 8005550000 文件中每条记录都以一个人名开始,后面跟随一个或多个电话号码。
编写程序,将来自一个文件中的行保存在一个vector中,然后使用一个istringstream从vector读取数据成员,每次读取一个单词 #include #include #include #include #include using namespace std; int main() { ifstream input("1.
#include #include #include #include using namespace std; int main(int argc,char *argv[]) { ifstream input(argv[1]); vector vec; ...
本文试图解释c++ primer Screen 和 Window_Mgr的例子,为什么将两个类放在两个文件中无法编译? 将两个类写在同一个文件中,通过三个例子解释问题: 第一种写法问题: 编译到Screen时,由于Screen类使用到Window_Mgr的成员函数,虽然前面给出了Window_Mgr的声明,但此时还清楚Window_Mgr的完整定义,所以编译出错。
有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。 声明静态成员 我们通过在成员的声明之前加上关键字static使得其与类关联在一起,和其他成员一样,静态成员可以使public得或private的。
聚合类 聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的: 所有成员都是public的 没有定义任何构造函数 没有类内初始化 没有基类,也没用virtual函数。
如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数。 能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。 例如,在Sales_data类中,接受string的构造函数和接受istream的构造函数分别定义了从这两种类型向Sales_data隐式转换的规则。
构造函数 每个类分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。