08 2014 档案
摘要:16.19 编写函数,接受一个容器的引用,打印容器中的元素,使用容器的size_type和size成员来控制打印元素的循环。16.20 重写上一题的函数,使用begin和end返回的迭代器来控制循环。#include#include#include#includeusing namespace st...
阅读全文
摘要:16.12编写你自己版本的Blob和BlobPtr模板,包含书中未定义的多个const成员。Blob.h(注意,成员函数的声明和定义要放在一个头文件中)/*记住,模板的头文件中通常既包括声明也包括定义。函数模板和类模板成员函数的定义通常放在头文件中,不能分开放。。。。谨记*/#ifndef BLOB...
阅读全文
摘要:16.4 编写行为类似标准库find算法的模板。函数需要两个模板类型参数,一个表示函数的迭代器参数,另一个表示值的类型。使用你的函数在一个vector和一个list中查找给定值。#include#include#include#include#includeusing namespace std;t...
阅读全文
摘要:15.26 定义Quote和Bulk_quote的拷贝控制成员,令其与合成的版本行为一致。为这些成员以及其他构造函数添加打印状态的语句,使得我们能够知道正在运行哪个程序。使用这些类编写程序,预测程序将创建和销毁哪些对象。重复实验,不断比较你的预测和实际输出结果是否相同,直到预测完全准确再结束。Quo...
阅读全文
摘要:15.7定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量一旦超过了限量,则超出的部分将以原价销售。Quote.h#ifndef QUOTE_H#define QUOTE_H#include#includeusing namespace ...
阅读全文
摘要:14.44编写一个简单的桌面计算器使其能处理二元运算。#include#include#include#includeusing namespace std;int add(int a,int b){ return a+b;}struct divide{ int operator()(i...
阅读全文
摘要:14.42 使用标准库函数对象及适配器定义一条表达式,令其1 统计打于1024的值有多少个。2 找到第一个不等于pooh的字符串3 将所有的值乘以214.43 使用标准库函数对象判断一个给定的int值是否能被int容器中的所有元素整除#include#include#include#include#...
阅读全文
摘要:14.38 编写一个类令其检查某个给定的string对象的长度是否与一个阈值相等。使用该对象编写程序,统计并报告在输入的文件中长度为1的单词有多少个,长度为2的单词有多少个、.....、长度为10的单词又有多少个。#include#include#include#include#includeusi...
阅读全文
摘要:14.34定义一个函数对象类,令其执行if-then-else的操作;该类型的调用运算符接受三个参数,它首先检查第一个形参,如果成功返回第二个参数的值;如果不成功返回第三个形参的值。#includeusing namespace std;class if_then_else{public: i...
阅读全文
摘要:13.57 编写Foo类。Foo.h#ifndef FOO_H#define FOO_H#include#include#includeusing namespace std;class Foo{public: Foo sorted() &&; Foo sorted() const &;...
阅读全文
摘要:13.50 没有定义析构函数#include#include#include#include#include#includeusing namespace std;class String{public: String():elements(nullptr),first_free(nullpt...
阅读全文
摘要:13.44 编写标准库string类的简化版本,命名String。你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数。使用allocator为你的String类分配所需内存。13.47 添加拷贝构造函数和拷贝赋值运算符,并添加打印语句,则每次函数执行时打印一条信息。13.48 ...
阅读全文
摘要:13.39 编写自己的StrVec,包括自己版本的reserve、capacity和resize。13.40 为StrVec添加一个构造函数,它接受一个initializer_list参数StrVec.h#ifndef STRVEC_H#define STRVEC_H#include#include...
阅读全文
摘要:13.33 13.36 13.37Message.h#ifndef MESSAGE_H#define MESSAGE_H#include#include#include#include"Folder.h"using namespace std;class Folder;class Message{f...
阅读全文
摘要:13.31为你的HasPtr类定义一个#include#include#include#includeusing namespace std;class HasPtr{friend void swap(HasPtr&,HasPtr&);public: HasPtr(const string &...
阅读全文
摘要:13.27 定义使用引用计数版本的HasPtr#include#include#includeusing namespace std;class HasPtr{public: HasPtr(const string &s=string()):ps(new string(s)),i(0),use...
阅读全文
摘要:13.22 假定我们希望HasPtr的行为像一个值。即,对于对象所指向的string成员,每个对象都有一份自己的拷贝。#include#include#includeusing namespace std;class HasPtr{public: HasPtr(const string &s=...
阅读全文
摘要:#include #include #include #include struct Numbered{ //! for ex13.14 Numbered() { static unsigned i = 0; ++i; mySn = i; ...
阅读全文
摘要:12.32 重写TextQuery和QueryResult类,用StrBlob代替vector保存输入文件。TextQuery.h#ifndef TEXTQUERY_H#define TEXTQUERY_H#include#include#include#include#include#includ...
阅读全文
摘要:新标准定义了4个无序关联容器。这些容器不是使用比较运算符来组织元素,而是使用一个哈希函数和关键字类型的==运算符。在关键字类型的元素没有明显有序关系的情况下,无序容器是非常有用的。在某些应用中,维护元素的序代价非常高昂,此时无序容器也很有用。虽然理论上哈希技术能获得更好的平均性能,但在实际中想要达到...
阅读全文
摘要:关联容器还定义了如下表所示的类型。这些类型表示容器关键字和值的类型。关联容器额外的类型别名key_type 此容器类型的关键字类型mapped_type 每个关键字关联的类型;只适用于mapvalue_type 对于set,与key_type相同 ...
阅读全文
摘要:关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。虽然关联容器的很多行为与顺序容器相同,但其不同之处反映了关键字的作用。关联容器支持高效的关键字查找和访问。两个主要的关联容器类型是map和set。map中的...
阅读全文
摘要:我们实现一个简单的文本查询程序。我们的程序允许用户在一个给定文件中查询单词,查询结果是单词在文件中出现的次数及所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。#include#include#include#include#include#include#include#includeu...
阅读全文
摘要:12.20 编写程序,逐行读入一个输入文件,将内容存入一个StrBlob中,用一个StrBlobPtr打印出StrBlob的每个元素。StrBlob.h#ifndef STRBLOB_H#define STRBLOB_H#include#include#include#includeusing na...
阅读全文
摘要:12.6 编写函数,返回一个动态分配的int的vector。将此vector传递给另一个函数,这个函数读取标准输入,将读入的值保存在vector元素中。再将vector传递给另一个函数,打印读入的值。记得在恰当的时刻delete vector。#include#include#includeusin...
阅读全文
摘要:11.20 使用insert代替下标操作。#include#include#include#includeusing namespace std;int main(){ map word_count; string word; while(cin>>word) { ...
阅读全文
摘要:11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。#include#include#include#includeusing namespace std;int main(){ vector> vec; ...
阅读全文
摘要:11.4 编写单词计数程序,忽略大小写和标点。例如,“example.”,“example,"和”Example“应该递增相同的计算器。#include#include#include#includeusing namespace std;int main(){ map word_count;...
阅读全文
摘要:与其他容器不同,链表类型list与forward_list定义了几个成员函数形式的算法,如下表所示。特别是,它们定义了独有的sort、merge、remove、reverse和unique。通用版本的sort要求随机访问迭代器,因此不能用于list和forward_list,因为这两个类型分别提供双...
阅读全文
摘要:任何算法的最基本的特性是它要求其迭代器提供哪些操作。某些算法,如find,只要求通过迭代器访问元素、递增迭代器以及比较两个迭代器是否相等这些能力。其他一些算法,如sort,还要求读、写和随机访问元素的能力。算法所要求的迭代器操作可以分为5个迭代器类别,如表所示:迭代器类别输入迭代器 只...
阅读全文
摘要:除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入元素流迭代器:这些迭代器被绑定到输入或输出上,可用来遍历所有关联的IO流反向迭代器:这些迭代器向后而不是向前移动。除了forwar...
阅读全文
摘要:对于那种只有一两个地方使用的简单操作,lambda表达式是最有用的。如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式。类似的,如果一个操作需要很多语句才能完成,通常使用函数更好。如果lambda的捕获列表为空,通常可以用函数来代替它。如前章节所示,既...
阅读全文
摘要:很多算法都会比较输入序列中的元素。默认情况下,这类算法使用元素类型的 &words,vector::size_type sz){ elimDups(words); stable_sort(words.begin(),words.end(),isShorter); //获取一个迭代器...
阅读全文
摘要:除了少数例外,标准库算法都对一个范围内的元素进行操作。我们将此元素范围称为“输入范围”。接受输入范围的算法总是使用前两个参数来表示此范围,两个参数分别是指想要处理的第一个元素和尾元素之后位置的迭代器。虽然大多数算法遍历输入范围的方式相似,但它们使用范围中元素的方式不同。理解算法的最基本的方法就是了解...
阅读全文
摘要:顺序容器只定义了很少的操作:在多数情况下,我们可以添加和删除元素。访问首尾元素、确定容器是否为空以及获得指向首元素或尾元素之后位置的迭代器。如果我们想要做:查找特定元素、替换或删除一个特定值、重排元素顺序等。标准库并未给每个容器都定义成员函数来实现这些操作,而是定义了一组泛型算法:称它们为“算法”,...
阅读全文
摘要:10.42 使用list的算法实现排序和删除重复元素。#include#include#include#includeusing namespace std;void elimDup(list &words){ words.sort(); words.unique();}bool isS...
阅读全文
摘要:10.29 编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里。#include#include#include#include#includeusing namespace std;int main(){ ifstream in("1.txt"); istr...
阅读全文
摘要:10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值。#include#include#include#include#includeusing namespace std;bool check_size(vector::...
阅读全文
摘要:10.21 编写一个lambda,捕获一个局部int变量,并递减变量值,直至它变为0.一旦变量变为0,再调用lambda应该不再递减变量。lambda应该返回一个bool值,指出捕获的变量是否为0.#include#includeusing namespace std;int main(){ ...
阅读全文
摘要:编写程序,求大于等于一个给定长度的单词有多少。我们还会修改输出,使程序只打印大于等于给定长度的单词。使用find_if实现的代码如下:#include#include#include#includeusing namespace std;void biggies(vector &words,vect...
阅读全文
摘要:10.13 标准库定义了名为partition的算法,它接受一个谓词,对容器内容进行划分,使得谓词为true的值会排在容器的前半部分,而使谓词为false的值会排在后半部分。算法返回一个迭代器,指向最后一个使用谓词为true的元素之后的位置。编写程序,接受一个string,返回一个bool值,指出s...
阅读全文
摘要:10.11编写程序,使用stable_sort和isShorter将传递给你的elimDups版本的vector排序。打印vector的内容。#include#include#include#includeusing namespace std;void elimDup(vector &words)...
阅读全文
摘要:void reserve (size_type n);reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化。reserve 的参数n是推荐预分配内存的大小,实际分配的可能等于或大于这个值,即n大于capacity的值,就会reallocate...
阅读全文
摘要:容器类型上的操作形成了一种层次:某些操作是所有容器类型都提供的,如下表所示一般来说,每个容器都定义在一个头文件中,文件名与类型名相同。即,deque定义在头文件deque中,list定义在头文件list中,以此类推。容器均定义为模板类。例如对于vector,我们必须提供额外信息来生成特定的容器类型。...
阅读全文
摘要:除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制。能使某种事物的行为看起来像另外一种事物一样。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不...
阅读全文
摘要:除了顺序容器共有的操作之外,string类型还提供了一些额外的操作。这些操作中的大部分要么是提供string类和C风格字符数组之间的相互转换,要么是增加了允许我们用下标代替迭代器的版本。构造string的其他方法除了前面的介绍的关于string的操作http://www.cnblogs.com/wu...
阅读全文
摘要:1 改变容器的大小我们可以使用resize来增加或缩小容器,与往常一样,array不支持resize。如果当前大小大于所要求的大小,容器后面的元素会被删除;如果当前大小小于新大小,会将新元素添加到容器后部:list ilist(10,42); //10个int:每个的值都是42ilist.resi...
阅读全文
摘要:为了理解forward_list为什么有特殊版本的添加和删除操作,考虑当我们从一个单向链表中删除一个元素时会发生什么。当添加或删除一个元素时,删除或添加的元素之前的那个元素的后继会发生变化。为了添加或删除一个元素,我们需要访问其前驱,以便改变前驱改变前驱的链接。但是,forward_list是单向链...
阅读全文
摘要:顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系的到了元素如何存储、访问、添加以及删除。向顺序容器中添加元素除了array之外,所有标准库容器都提供灵活的内存管理。在运行时可以动态添加或删除元素来改变容器大小。下表列出了向顺序容器中添加元素的操作。向顺序容器添加元素的操作操作...
阅读全文
摘要:每个容器类型都定义了一个默认构造函数。除array之外,其他容器的默认构造函数都会创建一个指定类型的空容器。且都能接受指定容器大小和元素初始值的参数。容器定义和初始化(所以容器的初始化)C c; 默认构造函数。如果C是一个array,则c中元素按默认方式初始化,否则c为空C c1(c2) ...
阅读全文
摘要:与容器一样,迭代器有着公共的接口,如果一个迭代器提供某个操作,那么所有提供相同操作的迭代器对这个操作的实现方式都是相同的。例如,标准容器类型上的所有迭代器都允许我们访问容器中的元素,而所有迭代器都是通过解引用运算符来实现这个操作的。类似的,标准库容器的所有迭代器都定义了递增运算符,从当前元素移动到下...
阅读全文
摘要:9.52使用stack对象处理带圆括号的表达式。遇到左圆括号时,将其标记下来。当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈。接着在stack对象中压入一个值,用以表明这个用一对圆括号括起来的表达式已经被替换。程序如下:#inclu...
阅读全文
摘要:栈使用在括号匹配中的例子程序如下:#include#includeusing namespace std;int main(){ stack initStack; char ch; while(cin>>ch) { if(ch=='('||ch=='{'||ch...
阅读全文
摘要:9.51 设计一类,它又三个unsigned成员,分别表示年月日。为其编写构造函数,接受一个表示日期的string参数。程序如下:#include#includeusing namespace std;class My_Date{public: My_Date(const string &s)...
阅读全文
摘要:9.50 编写程序处理一个vector,其元素都表示整数型。计算vector中所有元素之和。修改程序,使之计算表示浮点值的string之和。程序如下:#include#include#includeusing namespace std;int main(){ vector str={"1",...
阅读全文
摘要:9.47 编写程序,首先查找string"ab2c3d7R4E6"中的每个数字字符,然后查找其中每个字母字符。编写两个版本的程序,第一个要使用find_first_of,第二个要使用find_first_not_of。程序如下:#include#includeusing namespace std;...
阅读全文
摘要:9.43 编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldval替换为newVal。测试程序,用它替换通用的简写形式,如,将“tho”替换为“though”,将“thru”替换为“through”。程序如下:#includ...
阅读全文
摘要:9.28 编写函数,接受一个forward_list和两个string共三个参数。函数应在链表中查找第一个string,并将第二个string插入到紧接着第一个string之后的位置。若第一个string未在链表中,则将第二个string插入到链表末尾。#include#include#includ...
阅读全文
摘要:#include#includeusing 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(...
阅读全文
摘要:#include#include#includeusing 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.be...
阅读全文
摘要:std::vector::emplace_backC++Containers librarystd::vectortemplatevoidemplace_back(Args&&...args);(since C++11)Appends a new element to the end of the ...
阅读全文
摘要:一个容器就是一组特定类型对象的集合。顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。顺序容器概述下表列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。但是这些容器在以下方面都有不同的性能折中:向容器中添加或从容器中删...
阅读全文
摘要:假如有一个文件,列出了一些人和他们的电话号码。某些人只有一个号码,而另外一些人则有多个——家庭电话、工作电话、移动电话等。我们的输入文件看起来是这样的:morgan 2015552368 8625550123drew 9735550130lee 6095550132 2015550175 80055...
阅读全文
摘要:From:http://www.usidcbbs.com/read-htm-tid-1898.htmlC++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。 istringstream类用于执行C...
阅读全文
摘要:编写程序,将来自一个文件中的行保存在一个vector中,然后使用一个istringstream从vector读取数据成员,每次读取一个单词#include #include #include#include#includeusing namespace std;int main(){ ifst...
阅读全文
摘要:#include#include#include#includeusing namespace std;int main(int argc,char *argv[]){ ifstream input(argv[1]); vector vec; string tmp; whil...
阅读全文
摘要:本文试图解释c++ primer Screen 和 Window_Mgr的例子,为什么将两个类放在两个文件中无法编译?将两个类写在同一个文件中,通过三个例子解释问题:第一种写法问题:编译到Screen时,由于Screen类使用到Window_Mgr的成员函数,虽然前面给出了Window_Mgr的声明...
阅读全文
摘要:有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。声明静态成员我们通过在成员的声明之前加上关键字static使得其与类关联在一起,和其他成员一样,静态成员可以使public得或private的。静态数据成员的类型可以使常量、引用、指针、类类型等。举个例子,我们定义一个类,用它...
阅读全文
摘要:聚合类聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的:所有成员都是public的没有定义任何构造函数没有类内初始化没有基类,也没用virtual函数。下面的类都是一个聚合类struct Data{ int ival; string s;}...
阅读全文
摘要:如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数。能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。例如,在Sales_data类中,接受string的构造函数和接受istream的构造函数分别定义了从这...
阅读全文
摘要:构造函数每个类分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。构造函数的名字和类名相同。和其他函数不一样的是,构造函数没有返回类型;除此之外类似于其他...
阅读全文
摘要:每个类都会定义它自己的作用域。在类的作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符来访问。对于类类型成员则使用作用域运算符访问。不论哪种情况,跟在运算符之后的名字都必须是对应类的成员:Screen::pos ht=24,wd=80; //使用Screen定义的pos类型...
阅读全文
摘要:类的基本特性包括:类型成员、类的成员的类内初始值、可变数据成员、内联成员函数、从成员函数返回*this。类成员再探定义一个类型成员Screen不是显示器中的一个窗口。每个Screen包含一个用于保存Screen内容的string成员和三个string::size_type 类型的成员,它们分别表示光...
阅读全文
摘要:在C++语言中,我们使用访问控制说明符加强类的封装性:定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了(即隐藏了)类的实现细节。使用class或str...
阅读全文
摘要:当将一个类A的成员函数A::F设置成类B的友元时,需要预先定义类A,否则不能将A::F指定为友元。而在定义B之后,才能定义A::F,因为A::F被设为 友元正是为了访问类B的成员函数。所以,可以按照如下的顺序:声明类B定义类A,声明但不实现A::F定义类B,设置A::F为友元实现A::F下面是一个例...
阅读全文
摘要:编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。编写4个函数,分别对两个int值执行加、减、乘除运算。#include#include#includeusing namespace std;int plus1(int x,int...
阅读全文
摘要:函数指针函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如://比较两个string对象的长度bool lengthCompare(const string&,const string&);该函数的类型是bool(c...
阅读全文
摘要:void f();void f(int );void f(int,int);void f(double,double=3.14);f(5.6);//调用void f(double,double)确定候选函数和可行函数函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具...
阅读全文
摘要:1 默认实参某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。我们可以为一个或多个形参定义默认值,不过需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认...
阅读全文
摘要:函数重载如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。例如:void print(const char *cp);void print(const int *beg,const int *end);void pring(const int ia[],size_t size);...
阅读全文
摘要:#include #include using namespace std;//传入的参数是数组的指针,返回值是数组的指针string (*fun(string (*s)[10]))[10]{ return s;}//using str_arr = string (*)[10];/*typed...
阅读全文
摘要:#include #include using namespace std;//传入的参数是数组的引用,返回值也是数组的引用string (&fun(string (&s)[10]))[10]{ return s;}//using str_arr = string (&)[10];/*type...
阅读全文
摘要:return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句有两种形式:return;return expression;无返回值函数没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后...
阅读全文
摘要:一旦程序员把注意力都转向了对象传值方式隐含的效率问题(参见第 20 条)时,许多人都变成了极端的“改革运动者”,他们对传值方法采取斩草除根的态度,在他们不屈不挠追求传递引用方式的纯粹性的同时,他们也犯下了致命的错误:有时候传递的引用所指向的对象并不存在。这决不是一件好事情。请看下面的示例,其中的 R...
阅读全文
摘要:一般我们都知道不能返回局部变量的指针,但很多人知道其然,不知道所以然,那么接下来我们分析一下,先看两段代码/*test1.c*/#include char* get_str(){ char str[] = {"hello"}; return str;}int main(){ char* p = ge...
阅读全文
摘要:函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本。 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include ...
阅读全文
摘要:数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响,这两个性质分别是:不允许拷贝数组以及使用数组时(通常)会将其转换成指针。因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数。因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。尽管不能以值传递的...
阅读全文
摘要:当形参是const时,必须要注意关于顶层const的讨论。如前所述,顶层const的作用于对象本身:const int ci=42; //不能改变ci,const是顶层的int i=ci; //正确:当拷贝ci时,忽略了它的顶层constint *const p=&i; //const是顶层的,不...
阅读全文
摘要:跳转语句中断当前的执行过程,C++语言提供了4中跳转语句:break、continue、goto和return。break语句break语句负责终止离他最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。break语句只能出现在迭代语句或者swit...
阅读全文
摘要:#include#include#includeusing namespace std;int main(){ vector vec1={0,0,1,1,2,3,5,8}; vector vec2={5,8}; decltype(vec1.size()) j=0,m=0; f...
阅读全文
摘要:#include#include#includeusing namespace std;int main(){ string maxStr,Str1,Str2; int maxNum,Num1,Num2; if(cin>>Str1) Num1=1; maxNum...
阅读全文
摘要:首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换第1部分.隐式类型转换何时发生隐式类型转换在下面这些情况下,编译器会自动地转换运算对象的类型:在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型在条件中,非布尔值转换为布尔类型初始化过程中,初始值转换成变量的类型...
阅读全文
摘要:sizeof运算符返回一条表达式或一个类型名字所占的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t类型的常量表达式。运算符的运算对象有两种形式:sizeof(type)sizeof expr在第二种形式中,sizeof返回的是表达式结果类型的大小。与众不同的一点是,sizeof...
阅读全文
摘要:赋值运算符的左侧运算对象必须是一个可修改的左值,如果给定int i=0,j=0,k=0; //初始化而非赋值const int ci=i; //初始化而非赋值则下面的赋值语句都是非法的:1024=k ; //错误:字面值是右值i+j=k; //错误:算术表达式是右值ci=k;//错误:ci是常量...
阅读全文
摘要:#include#include#includeusing namespace std;int main(){ int ia[3][4]={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; for(int (*p)[4]=ia;p!=i...
阅读全文
摘要:多维数组严格来说,C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。谨记这一点,对今后理解和使用多维数组大有益处。使用范围for语句处理多维数组两层嵌套的for循环来处理多维数组的元素:constexptr size_t rowCnt=3,colCnt=4;int ia[rowCnt][...
阅读全文
摘要:尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约...
阅读全文
摘要:#include#include#includeusing namespace std;int main(){ vector::size_type i=0; int arr[10]={0,1,2,3,4,5,6,7,8,9}; //使用整型数组初始化一个vector对象 v...
阅读全文
摘要:数组是一种类似于标准库类型vector的数据结构,但是在性能和灵活性的权衡上又与vector有所不同。与vector相似的地方是,数组也是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在位置访问。与vector不同的地方是,数组的大小确定不变,不能随意向数组中增加元素。因为数组的大小固...
阅读全文
摘要:#include#include#includeusing namespace std;int main(){ vector str={"The is C++ program ","hfh ","","hfdshfisoid"}; for(auto it=str.begin();it!=...
阅读全文
摘要:我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器。所有标准库容器都可以使用迭代器,但是其中只有少数几种才同时支持下标运算符。严格来说,string对象不属于容器类型,但是string支持很多与容器类型类似的...
阅读全文
摘要:#include#include#includeusing namespace std;int main(){ string word; vector Str; while(cin>>word) Str.push_back(word); for(auto c:...
阅读全文
摘要:标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。因为vector“容纳着”其他对象,所以它被称为容器。要想使用vector,必须包含适当的头文件。#includeC++语言既有类模板,也有函数模板 ,其中vector是一个类模...
阅读全文
摘要:#include#includeusing namespace std;int main(){ string str="atfi,,ie,,,idfi,,,oo"; decltype(str.size()) n=0; for(auto c:str) { if(!ispun...
阅读全文
摘要:#include#includeusing namespace std;int main(){ const string hexdigits="0123456789ABCDEF"; cout>n) { if(n<hexdigits.size()) ...
阅读全文
摘要:标准库类型string标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中。接下来的示例都假定了已包含了下述代码:#include using std::string; 本节描述最常用的string操作...
阅读全文
摘要:预处理技术概述确保头文件多次包含仍能安全工作的常用技术是预处理器,它由C++语言从C语言继承而来。预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序。之前已经用到了一项预处理功能#include,当预处理器看到#include 标记时就会用指定的头文件的内容代替#include。C++...
阅读全文
摘要:C++11新标准规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将默认初始化。对类内初始值的限制与之前介绍的类似:或者放在花括号里,或者放在等号右边,记住不能使用圆括号。
阅读全文