自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

pyb的博客

一个编程之路上的初学者

  • 博客(44)
  • 收藏
  • 关注

原创 C++primer学习:类模板(1):函数模板,模板参数,实例化

模板是范型编程的基础[练习]:定义一个通用的函数模板,对两个元素进行比较.在定义模板的时候对模板实参的要求越少越好,比如这个函数里面就只要求定义了<符号函数参数一定要是const引用,这样有两个好处,第一避免拷贝,第二可以避免实参是不可以拷贝类型时发生错误.template <typename T> int compare(const T& a, const T& b){ return

2015-10-30 22:58:25 463

原创 C++primer学习:面向对象程序设计(5):再探文本查询程序

这一节初步探讨了如何设计一个继承类体系。为我们前面所写的文本探测程序添加以下功能:(1):可以将查询结果进行|,&,~的运算.运算的优先级按照C++规定的表达式来进行.如Query(“hair”)|Query(“bird”);(2) : 添加一个历史系统,能够查询前面的进行的某个查询.并可以在其中增加内容并与其他查询组合.(3):允许用户在查询的时候做出限制,从给定范围中挑出匹配的行显示.这个体系的

2015-10-30 17:28:08 747

原创 C++primer学习:关于upper_bound和lower_bound的探究.

今天花了将近一个小时仔细研究了这两个范型算法以及关联容器定义的同名函数.下面就来讲一讲它们的用法和一些细节.[1]首先是范型算法upper_bound与lower_bound;它们要求必须提供至少前向迭代器,且容器元素必须有序,每个算法都提供两个版本。lower_bound(beg,end,val)lower_bound(beg,end,val,cmp);//upper_bound形式一样主要探究

2015-10-29 19:29:14 1535

原创 C++primer学习:面象对象程序设计(5):容器与继承

我们不能在容器中保存不同类型的元素.即使它们是具有继承关系的类体系.一般来说,直接保存对象会导致派生类中的基类部分被忽略.所以我们通常采取用指针来保存对象。一般用智能指针进行保存.[练习]:定义一个存放Quote对象的vector和存放指针的vector来比较两者的不同.vector<shared_ptr<Quote>> baseket1; vector<Quote> baseket2;

2015-10-29 18:57:43 349

原创 C++primer学习:面象对象程序设计(4):继承类中的作用域和拷贝控制

派生类的作用域嵌套在基类之中.在编译时进行的名字查找是由静态类型决定的.关键概念:在进行函数调用时,假设我们使用p->mem(),则执行以下四个步骤.首先确定p对应的静态类型,查找对应的mem,如果找不到,则依次在直接基类中不断查找直到到达继承链的顶端。如果找遍了任然找不到,则编译器将报错.一旦找到,则判断mem是否是虚函数,如果是虚函数,则编译器将在运行时确定运行哪个虚函数的版本.否则,将产生一个

2015-10-28 20:20:16 421

原创 C++primer学习:面向对象程序设计(3):访问控制与继承

每个类控制着成员对于派生类来说是否是可以访问的.需要注意procted的成员只对于派生类对象本身可以访问,但是派生类的成员函数和友元对于一个基类成员的procted成员没有访问特权.class Sneak:public Base{friend void clobber(Base&);//没有对Base procted对象的访问权利}公有,私有和受保护继承.派生列表中的访问说明符对于派生类成员能

2015-10-28 15:41:42 301

原创 C++primer学习:面向对象程序设计(2):抽象基类

新增了 纯虚函数,抽象基类的概念.出虚函数用=0声明,含有该类函数的类是抽象基类,它们用来表示一种通用概念,而不是具体的操作策略,因此不能定义抽象基类对象.我们通过对抽象基类的继承来定义实现具体策略的派生类.[练习]:定义一个Disc_quote的抽象基类,用来支持不同的折扣策略.然后重写Bulk_quote Limit_quote类。class Quote{public: Quote(

2015-10-28 12:43:45 324

原创 C++primer学习:面象对象程序设计(1):定义基类和派生类

通过继承将基类和派生类联系在一起.新出现的知识点有虚函数,protected关键字,动态绑定.[练习]:定义Quote类,保存书的信息.作为一个基类,后续将会定义其他派生类(保存打折书籍的信息),以及一个打印书信息的函数(通过动态绑定来判断调用那种类的函数).class Quote{public: Quote() = default;//默认构造函数 Quote(const st

2015-10-28 12:06:58 468

原创 C++primer学习:重载运算符(4)

可调用对象与function;[练习]:编写一个简单的桌面计算器使其能够处理二元运算.class Add{public: int operator()(int val1, int val2) { return val1+val2; }};int divide(int a, int b){ return a / b;}int main(){ auto subt

2015-10-27 14:08:55 320

原创 C++primer学习:重载运算符(3)

为StrBlobPtr编写解引用运算符*和箭头运算符.注意箭头运算符只能返回一个指针或者一个重载了箭头运算符的对象.string& operator*()const { auto p = check(curr, "deference past end"); return (*p)[curr]; }//返回所指string的引用 string* operator->()const { ret

2015-10-26 22:22:10 310

原创 C++primer学习:重载运算(2)

关系重载运算符bool operator!=(const StrVec& lhs, const StrVec& rhs){ return !(lhs == rhs);}bool operator==(const StrVec& lhs, const StrVec& rhs){ return(lhs.size() == rhs.size() && equal(lhs.eleme

2015-10-26 16:24:38 347

原创 C++primer学习:重载运算(1)

重载运算符号的概念在前面书本上已经介绍过了,我们需要关注的是什么时候将其定义为成员,什么时候定义为普通函数.[1]赋值,下标,调用(()),和访问箭头(->)必须是成员.[2]复合运算符一般来说应该是成员,但并非必须.[3]改变对象状态,或者与给定类型密切相关的应该是成员,比如递增,递减,解引用.[4]具有对称性的运算符号如算术,相等性,关系和位运算符号,应该是普通函数.[练习]:为Sales_da

2015-10-25 13:51:11 303

原创 C++primer学习:拷贝控制(7):对象移动

很多时候我们不需要拷贝对象,而是需要”接管”原来的内存,这时候C++提供了一些支持.[1]右值引用:通过&&来获得右值引用,右值引用只能绑定到一个将要销毁的对象;[2]std::move(object),可以帮助我们显式的获得一个左值的右值引用.[3]移动构造函数,只是接管原来的内存,而不会创建新的内存,也不会拷贝元素.同时必须保证源对象处于可析构的状态.[4]移动赋值运算符号,同上。[练习1]:对

2015-10-24 21:32:13 304

原创 C++primer学习:拷贝控制(6):编写简化的string类

利用allocator类编写自己的string类,实现的功能有:(1)拷贝构造函数和普通构造函数,接受c字符串风格的参数(2)重载了运算符,实现=,和+(拼接字符串)(3)实现了4种查找函数,可以定义查找的起始位置(或者不定义),查找第一个出现的满足条件的字符或者第一个不满足的字符.以及第一个出现在指定字符集的字符.全部返回迭代器.(4)定义了相应的析构函数,和一些成员接口(5)定义了提取子字符串的

2015-10-21 10:39:56 270

原创 C++primer学习:拷贝控制(5):动态内存管理类_编写自己的vector

编写自己的简化版本的vector.简化处在于没有使用模板,只用于string.首先对于内存的管理应该使用allocator类来管理。注意许多成员的公共部分应该定义成私有部分,避免重复代码.定义几个指针用于指向动态内存的有效元素范围与分配的内存范围.#include "iostream"#include "string"#include "memory"#include "utility"#i

2015-10-20 12:59:57 510

原创 C++primer学习:拷贝控制(5)

编写两个可能用于邮件处理的类,分别命名为Message和Folder,分别表示电子邮件消息和消息目录.[1]每个Message对象可以出现在多个Folder目录中,但是任意给定的Message内容只有一个副本.如果一条Message的内容被改变,则从任何目录浏览次Message时都会看到改变后的内容. [2]当拷贝一个Message对象时,副本和原对象将是不同的Message对象,但是它们必须出现

2015-10-19 21:04:19 337

原创 C++primer学习:拷贝控制(4)

交换操作:管理资源的类通常定义一个名为swap的函数.对于哪些与重排元素顺序的算法一起使用的类,定义swap是非常重要的.这类算法会在需要交换两个元素的时候调用swap.如果一个类定义了自己的swap,那么算法将使用自己的自定义版本.很多时候我们不希望分配内存,而是希望交换指针.[练习]为类值版本的Hasptr编写swap函数,并测试它.class Hasptr{ friend void

2015-10-19 20:37:37 303

原创 新浪笔试:大数相乘.

这是一道新浪的笔试题,计算两个很大的数相乘并输出结果.思路是采取分解两个大数,将它们写成(a1*10^n1 + a2*10^n2…..)*(b1*10^n1 + b2*10^n2…..)的形式,然后计算a1b1,a2b2…,然后加上权重,最后加起来.算法的时间界是(N1*N2/M^2),N1,N2是输入的位数.#include "iostream"#include "string"#inclu

2015-10-19 13:50:22 350

原创 C++primer学习:拷贝控制(3)

定义行为象值的类,对于这种定义的类,每一个对象都应该有一份自己的拷贝.它们的改变不会影响原对象.[练习]:希望StrBlob的行为像一个值,定义相应的拷贝控制成员.StrBlob(const StrBlob & rhs)//拷贝初始化 { data = make_shared<vector<string>>( vector<string>(*rhs.data)); }

2015-10-19 13:38:24 247

原创 C++primer学习:拷贝控制(2)

析构函数与构造函数执行相反的操作,它是类的一个成员函数,名字由波浪号接类名构成.没有返回值,不接受参数.析构函数是唯一的什么时候调用析构函数:[1]变量离开作用域[2]当一个对象被销毁,其成员也被销毁[3]对于动态分配的对象,当对它的指针应用delete操作;[4]对于临时对象,当创建它的完整表达式结束时被销毁.xigou函数体本身不销毁成员,成员是在析构函数体之后的析构阶段被销毁的.[练习]:为H

2015-10-16 20:13:59 362

原创 C++primer学习:拷贝控制(1)

拷贝构造函数:拷贝构造函数的第一个参数是自身类型的引用,且任何额外的参数都都有默认值.它定义了当我们将另一个对象作为参数时发生的操作;每个类都有自己的默认的合成拷贝函数.拷贝构造函数发生在下列情况:(1)我们使用=定义变量;(2)从一个返回类型为非引用的函数返回对象(3)用花括号列表初始化一个数组中的元素或者一个聚合类的成员.(4)某些类类型对它们所分配的对象使用拷贝初始化.============

2015-10-16 14:06:35 452

原创 C++primer学习:文本查询程序

编写一个程序,允许在给定文件中查询一个单词,查询结果是单词在文件中出现的次数以及所在行的列表.要求编写两个类来管理数据.Textquery类用来读取数据.QueryResult类用来生成结果并保存.#include "iostream"#include "fstream"#include "sstream"#include "string"#include "vector"#includ

2015-10-14 22:17:38 315

原创 C++Primer学习:动态内存与智能指针(3)

[练习:]从文件中按行读入,放入一个StrBlob中,然后用一个StrBlobPtr打印出来.//bool operator(const StrBlobPtr & p){return p.curr != curr;}; 在类内部重载了!=StrBlob record; ifstream in_file("text.txt"); string line; while (getl

2015-10-14 20:11:49 331

原创 C++Primer学习:智能指针与动态内存(2)

unique_ptr,它也是一种智能指针,但是某个时候只能有一个指向unique_ptr指向一个给定对象.//定义并初始化unique_ptr<int > p(new int(42));p = nullptr;//释放p.release();//放弃对指针的控制,返回指针.但是不释放所指对象p.reset();//释放所指对象p.reset(q);//释放所指对象,提供内置指针q,并令p指向

2015-10-14 15:12:14 307

原创 C++primer学习:智能指针与动态内存(1)

智能指针是新标准提供的一种管理动态内存的工具,它会自动的释放所管理的内存(如果所有对该对象的引用都不存在了)。定义智能指针的方式有make_shared<T>(args) shared_ptr p(q)练习:定义一个能够共享对象的类:StrBlob.需要用到智能指针,指向一个动态分配的内存.定义相应的构造函数.用到了initializer_list模板;同时注意重载const版本的f

2015-10-11 22:47:15 360

原创 poj1062解题报告:

Description:年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:”嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。”探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或

2015-10-11 15:06:29 885

原创 C++primer学习:关联容器练习(4)

单词转换程序:将一个文本中的单词按照另一个文本的转换规则,替换成另外一个文本中的单词.并且开头字母大写;#include "iostream"#include "vector"#include "list"#include "map"#include "set"#include "string"#include "algorithm"#include "utility"#inclu

2015-10-10 23:14:31 319

原创 C++primer学习:关联容器(3)

find操作(1)find(k),返回一个迭代器,指向第一个关键字为k的元素.(2)count(k),返回返回键字为k的元素的数量(3)lower_bound(k)返回一个迭代器,指向第一个关键字不小于k的元素.(4)upper_bound(k)返回一个迭代器,指向第一个关键字大于k的元素.(5)equal_range(k),返回一个迭代器pair,表示关键字等于k的范围.如果k不存在,pair的两

2015-10-10 21:29:20 263

原创 C++primer学习:关联容器(2)

pair对象的创建方式using P = pair<string, int>;int main(){ vector<P> data; string word; int interger; while (cin >> word >> interger) data.emplace_back(word, interger);//最简单 /* d

2015-10-10 13:58:59 261

原创 C++primer学习:关联容器(1)

map:每一个对象都是pair对象,是关键字与值集合.set:仅仅是关键字的集合,用来查找是否存在.练习:读取文本,统计常用关键字之外的单词出现次数.map<string, size_t> word_counts; set<string> exclude = { "a", "an", "the", "is", "he" }; string word; while (cin>>

2015-10-09 22:05:11 244

原创 poj3259:spfa解法

构建一个队列,将松弛成功且不在队列的点放入队列,每次出队一个点.直到队列为空,如果队列中的某个入队次数超过n次,就说明存在一个负环.#include "vector"#include "queue"#include "iostream"using namespace std;const double inf = 10000000;struct node{ int end;

2015-10-09 16:36:49 431

原创 poj3259解题报告

题目等价于判断图里面是否存在一个负环.首先可以采用bellman_ford算法,但是该算法需要一个起始点,而这里是需要判断整个图是否存在负环.因此可以假设有一个源点,假设它与其他所有点连通,并且花费都是0.这样就可以直接调用bellman_ford算法,如果原来的图存在负环,那么它一定也在新的源点所在的连通图里面.#include "vector"#include "iostream"using

2015-10-09 15:23:09 337

原创 C++primer学习:再探迭代器

插入迭代器:(1)back_inserter,创建一个使用push_back()的迭代器. (2)front_inserter,创建一个使用push_front()的迭代器. (3)inserter创建一个使用insert的迭代器.此函数接受第二个参数,一个指向给定容器的迭代器.元素将被插入到给定迭代器所表示的元素之前. 注意,容器必须支持相应操作才能够用相应的插入迭代器; .练习:用uni

2015-10-08 18:57:05 295

原创 C++primer学习:泛型算法(3)

lambda表达式,lambda表达式有点类似于函数,它的格式是[capture list](parameter list) ->return type{function body;};为什么要引入它呢?因为我们在使用谓词的时候只能接受一元或者两元谓词。如果需要传递更多的参数时没有任何办法的.这个时候就需要把原来的谓词实参改为lambda表达式.它可以通过capture list传递它所在的函数里面

2015-10-08 11:42:40 287

原创 c++primer学习:泛型算法(2)

[1]sort操作,它是利用元素类型的<运算符来实现排序的[2]unique算法,消除相邻的重复项,并返回一个指向不重复范围末尾的迭代器.(容器的大小不变,元素并没有真的消除,只是我们看不到了而已) vector<string> words{ "hello","world","I am","pezy","hello" }; print(words); sort(words.be

2015-10-07 13:42:37 219

原创 C++primer学习:泛型算法(1)

[1]大多数算法都定义在algorithm中,它们不依赖于容器的类型(迭代器作为参数);算法只运行在迭代器之上!!!//count是一个计算某元素给定范围出现次数的操作 vector<int> vec{ 1, 2, 3, 3, 2, 2, 25, 6, 7, 8, 2 }; vector<double> vdc{12, 34, 56, 78}; cout << count(vd

2015-10-06 21:04:50 326

原创 C++primer学习:string类操作练习(3)

读入一个括号化的表达式,遇到一个左括号将其入栈,遇到一个右括号将匹配括号之间的表达式出栈,然后把计算结果入栈.//相当于去括号.[1]定义了加减乘除的基本运算.[2]使用了把正常中缀表达式转换成前缀表达式,然后计算前缀表达式的方法.[3]主函数主要处理括号.“`include “stack”include “queue”include “vector”include “string”include

2015-10-06 19:17:10 335

原创 C++primer学习:string类的练习(2)

设计一个类,它有三个unsigned成员,分别表示年月日.为其编写构造函数,接受一个表示日期的string参数,该函数应该能处理不同类型的格式,如January,1,1900 1/1/1900,Jan 1 1900,等格式个人理解是月,日,年用某种方式分开就应该可以处理.不局限于题目给出的三种.比如1,1,1900 Jan_1_1900都可以处理.#ifndef cp_09_1#define cp

2015-10-04 22:31:22 495

原创 C++primer学习:string的操作习题(1):

使用迭代器与insert,erase函数将一个给定s中的old替换成newv;void func(string &s, const string &old, const string &newv){ for (auto it = s.begin(); (it + old.size()) != s.end();++it) { if (string(it, it + o

2015-10-04 22:03:58 357

原创 C++primer学习:顺序容器(3)

[1]forward_list和其他顺序容器不同,它有一些特殊的操作.因为改变一个链表中的元素必须改变它的前驱的状态,因此相应的操作是Insert_after(p,t)/(p,n,t)/(p,b,e)在p之后添加元素t/n个t/迭代器b,e(不包括e)之间的元素,erase_after(it)/(b,e)意思是删除/添加it之后的元素.练习:删除一个forward_list中的奇数 using

2015-10-04 13:06:18 247

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除