如何快速学习C++?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速学习C++?相关的知识,希望对你有一定的参考价值。
大一学习的c++,工作之后也一直用的c++。
1. 涵盖c++入门到精通的图书列表
《The C programming language》必读
《C++ Primer》,号称是一本可以让你从C或JAVA程序员转为一个真正的C++程序员的入门参考书,必读。
《The C++ programming language》,C++之父,人称B教主著作,在看过C++ primer后,应该可以跳章选读。
《Think in c++》,网上说此书的中文版翻译质量奇差,推荐看影印版,选读。
《Effective c++》,类似 Effective java,讲的是最佳实践,程序员必读。
《More effective c++》,上书的补充。
《The C++ standard library》,会写C,不会用标准库怎么行。这就跟java程序员不会用java.util包一样,必读。
《Effective STL》,STL库的最佳实践。Effective C++作者又一力作,必读。
《The annotated STL source》,STL源码分析,这本书应该算是深入/精通类了,选读。
《Generic programming and STL》,号称C++编程里,就是跟模板,泛型打交道,那么精通泛型是势在必行。
《C++ Template》,C++模板编程,代码复用的经验之道,必读。
《Exceptional C++》,跟Effective C++类似,属于最佳实践和难题解析,书中列出了许多应用场景和实例代码供读者揣摩,选读。
《More Exceptional C++》,上书的补充。
《Exceptional C++ Style》,上上书的补充
《Inside The C++ Object Model》,有了上面这些书做铺垫,那么终于可以读此神书了。它会带你游览C++对象模型的底层实现机制。读完此书,任何C++代码看起来如同行云流水,必读。
2. 优秀的C/C++开源项目(阅读代码)
OS:Linux kernel LVS、Linux应用程序
DB:mysql、PostgreSQL
Complier:VM、GCC
Framework:OpenSip、SipProxy、
Net:ACE(Java Mina、Netty)、TCP/IP、HTTP协议栈
Cache:Memcached、Redis、
Library:STL(java util package)、Boost、Qt(UI)、
balance:Apache、nginx
GSL
地址:https://github.com/microsoft/GSL
Boost文档
地址:https://www.boost.org/doc/libs/
wxWidgets官网
地址:http://wxwidgets.org/
gtkmm
地址:https://www.gtkmm.org/en/
CopperSpice
地址:https://www.copperspice.com/
Qt
地址:https://www.qt.io/Eigen
地址:http://eigen.tuxfamily.org/index.php?title=Main_Page#Documentation
Plot utils
地址:https://www.gnu.org/software/plotutils/
Asio
地址:https://think-async.com/Asio/
POCO
地址:https://pocoproject.org/
abseil
地址:https://abseil.io/
C++开源库汇总列表
地址:https://en.cppreference.com/w/cpp/links/libs
除了这些开源项目,也可以找一些免费的公开课,那这里也推荐一个ACM金牌大佬讲授的免费C++课程,可以去体验一下:
学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样
已失效
3.C++语法讲解
语言基础
详细介绍变量、表达式、语句、指针、数组、流程控制、函数、文件组织等。
抽象机制 - 面向对象编程
深入讲解C++的抽象机制,封装(类)、继承、多态;操作符重载、函数对象、异常处理等。
模板 - 泛型编程
详细介绍C++的模板机制,类模板、函数模板、模板特化等方面的内容。
4.深入c++面向对象
4.1、从C到C++
引用和指针:为什么引用很重要
const关键字:为什么const很重要
名字空间 (namespace)
4.2、深入C++对象
关于C++对象
内置类型的对象,如int、double对象,自定义类型的对象
对象类型的定义
关键字class和struct
类成员:成员函数和数据成员
静态数据成员
成员的访问控制
对象的size
关于this指针
onst成员函数、const究竟修饰什么
mutable数据成员
4种特殊成员函数:constructor、destructor、copy constructor、operator=
对象的构造、初始化列表
对象的析构
对象的复制
什么情况下有必要显式定义4种特殊函数
C++对象生命周
4.3、操作符重载
关于C++中操作符重载机制
重要操作符重载
算术运算:+, -, *, /, %, ++, --, ...
关系运算:>, <, ==, !=
下标存取:[ ]
函数调用:(),函数对象
类型转换、单参数构造函数与隐式转换、阻止隐式转换 -- explicit关键字
友元与成员
4.4、面向对象基础 -- 继承
基类与派生类
再谈对象的构造与析构
虚函数、纯虚函数
派生类的内存布局、虚函数表
多态、多态类型、如何体现多态
虚析构、为什么虚析构很重要
4.5、关于继承更多的话题
多继承
虚继承与虚基类
对基类的访问、public / protected / private继承
Down cast:static_cast<>和dynamic_cast<>
运行期类型识别 (RTTI)
4.6、C++与面向对象设计
C++语言机制提供了完整的OOP支持
超越继承
OOP若干法则和设计模式
5.C++泛型编程与STL
5.1、C++ 模板机制
5.2、STL 概要
5.3、STL容器
5.4、STL迭代
5.5、STL算法
5.6、预与定义STL数对象
5.7、STL适配器
6. C++进阶
《C++ Primer》
最新版本:第三版(第四版国外已上架, 国内一些网上书店也在预订中)
适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是 好事。
《The C++ Programming Language》/《C++程序设计语言》
最新版本:第三版特别版
简称 TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来)
《Essential C++》
《Accelerated C++》
这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。
以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。
《Effective C++》
最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中)
简称EC。C++程序员必读!很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。
《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 编程规范》
个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系 列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言,关于“为什么这么做”的问题,解释的不够。
我 的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不 会过时,人们将广为传诵它制定的101条戒律。
还不知道他的简称,也许“101”会成为一个候选者?
提到《Effective C++》,那么另外三本书一一浮出水面:
《More Effective C++》
《Exceptional C++》
《More Exceptional C++》。
新书《Exceptional C++ Style》也是值得一看的好书。
上 述几本书,一本也不应该放过。
个人建议上述书籍按顺序阅读。并且,在将来反复阅读这几本书。
《Thinking in C++》/《C++编程思想》
这本书及其中文版传言好坏都有,没有认真看过,不做评价,如果确有兴趣,不妨尝试 一下该书。
以下几本书基本上涉及的都是语言本身,大体上可以按照以下的顺序阅读。
《C++必知必会》
如果早一年,这本书将是重量级的,然而它被101和《Exceptional C++ Style》盖过一头。
《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序设计陷阱》
这又是一本我未曾读过,而且广受好评的书。
《STL 源码剖析》
这本书我刚到手,就被人"借"走,以至于到现在也没有看过。看过这本书的朋友,可以给一个合适的评价。
7. C++进阶之数据结构基础
这是所有编程语言中最应该学习的部分,程序组成的基础之一。
顺序存储、链式存储、循环链表;
双向链表、栈(顺序和链式)、队列(顺序和链式);
栈的应用、树基本概念及遍历、二叉树;
排序算法、并归算法、选择、插入、快速、希尔。
以上这些内容你知道吗?
8. C++进阶之UI界面开发
掌握QT类库构架,图形界面开发模型;
掌握QT开发技巧,消息机制,图形处理;
掌握QT网络编程,UDP,TCP使用方式;
掌握QT文件处理方式,序列化;
掌握QT在windows,linux,ios,android不同平台下的移植技术。
9. C++进阶之Unix/Linux网络服务器
掌握Unix/Linux平台开发方式;
熟练使用系统调用;
熟练Unix/Linux内存管理,进程,线程调度;
熟悉网络服务器开发方式,熟练编写TCP,UCP网络服务程序;
掌握同步/异步IO模型在网络编程中的使用方式。
10.C++进阶之数据库开发
掌握SQL语言的实用技巧。Oracle,MySQL数据库的使用方式。
如果你能熟练掌握以上列出的技能,具备解决复杂问题和技术难点的能力,而且你能独立开发一些比较复杂的功能模块,那么很荣幸地告诉你,你已经达到中级水平,薪资过万对你来说简直是小菜一碟。
11.C++标准参考
C++ reference
地址:https://en.cppreference.com/w/
C++ Coding Standard
地址:http://www.possibility.com/Cpp/CppCodingStandard.html
Standard C++
地址:https://isocpp.org/
State of C++ Evolution
地址:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2597.html
The C++ Resources Network
地址:http://www.cplusplus.com/
Draft C++ Standard: Contents
地址:http://eel.is/c++draft/
需要资料私聊我
1、C++的程序员身价普遍较高,当然,前提是你必须是高手。
2、C++应用领域a.游戏 C++的效率是一个很重要的原因b.网络软件 C++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平 台的、重量级的ACE库,该库可以说是C++语言最重要的成果之一, 在许多重要的企业、部门甚至是军方都有应用。c.分布式应用。d.操作系统 在该领域,C语言是主要使用的编程语言。但是C++凭借其对C的 兼容性,面向对象性质也开始在该领域崭露头角。e.设备驱动程序 也是因为效率的原因。f.移动(手持)设备.h.嵌入式系统.i.教育与科研。
学习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过,对于一个所谓的新手而言,究竟是一个完完全全的新手,还是一个熟悉某种别的语言的“新手”,甚至是在某种语言程序设计领域已经颇有建树的高手,很难一概而论?不同的C++新手需要不同的入门书籍。
1《C++Primer》
有“C++的百科全书”,C++程序员人手必备。对语法、语义的描述非常细致和严谨,适合有一定经验的C、C++程序员作为工具书和理论指导书使用,但由于其有一定深度,而没有进阶顺序的章节安排,所以不适合初学者做为教材使用,价格略高。
2《C++Primer Plus》
初学C++不错的书,覆盖面较全,章节安排比较合理,由浅入深,也很容易,故因此失去了一些深度。价格比较便宜,但翻译质量略有不足。
3《Essential C++》
lippman的一部面向初学者的作品。在他写了那么后一本primer之后,为何还要写这么薄这么浅的书呢?其实primer对于初学者来说太笨重了,而这本书却是从不同的方面——C++的本质和组织结构对语言进行阐释,可以帮助初学者对这门语言有一个大致的了解,但知识范围不很全面,不适合系统学习,读者需要一定的编程知识。
4《C++编程思想》
除了讲述语言之外,有一定的工程性,从设计者的角度来描述C++怎样应用在实际的项目中。语言描述的全面性欠佳,但还是有一定精度的,尤其是在一些小技巧方面。本书还引入了大量的战例,通过一个个的真实项目来引导你使用C++的思想去思考问题。翻译很差,有一定难度。
学习基础语法,熟悉调用各种库函数,这时你便成为一名初级C++程序员了。 参考技术B 快速高效的学就只有一个办法,花钱到电脑学校找老师带你 参考技术C 可以直接看简单的代码,通过代码学习。 参考技术D 没什么快速的方法。只能扎实的学习。
c++调用python脚本,指针快速传递
优秀的判断力来自经验,但经验来自错误的判断。–Fred Brooks
1、python以开发速度快著称。
2、python在数据处理方面具备强大的优势。
尤其在深度学习与机器学习方面,虽然现在有pytorch、tensorflow在部署上提供了像libtorch的c++版本,但那也只包括模型推理部分。如果在前期预处理上也用c++实现,那会是一件十分麻烦的事情。
因此,想通过c++调用python中函数的方式,将数据实现互传。(踩了许多的坑,网上有许多通过list或者tuple来传递的,如果是小数据也没什么问题。但如果遇到医疗这样的大数据,会需要极大的内存开销。本文将采用numpy指针的方式来传递数据,在内存开销与速度上都有极大的提升)。
此处环境配置是为了在无安装python环境的机子上运行。(如果电脑已安装环境就不需要拷贝,只需将环境变量加入即可)。
注意:python与c++的位数一定要对应,例如全为32位或者全为64位。
新建一个项目,将python安装的include与libs,拷贝到c++运行目录下。
由于python安装是没有debug模式的,但又需要在c++中使用到debug模式。
方法一:直接将libs文件夹的python38.lib复制一份该名称为python38_d.lib。(该方式不推荐,后续代码释放内存会有问题)
方法二:修改include下的pyconfig.h。
将pragma comment(lib,"python38_d.lib")改为pragma comment(lib,"python38.lib"),并且注释掉 # define Py_DEBUG
添加python库
将python安装目录下的DLLs与Lib拷贝c++到运行目录下(此处默认你安装了Numpy)。
拷贝python38.dll到c++运行目录(python安装目录下的文件)。
上述准备材料即准备完成。
打开vs属性管理器添加:
1.包含库目录添加之前拷贝来的include以及Lib下的numpy。
2.库目录添加libs以及Lib下的numpy的lib。
3.连接器输入添加python38.lib和npymath.lib。
以上的配置都包含了numpy,如果不想用numpy,也可以不添加numpy的任何操作。数据传输也是可以用list或者tuple来完成。但经我实验发现,numpy的数据传输方式内存开销起码节约5倍以上,速度也快5倍以上。
using namespace std;
int main()
{
//指定python.exe位置 python的环境。后来在迁移环境时,将include libs放在工程目录下,指定工程目录就可以
Py_SetPythonHome(L"./");//指定python.exe位置需要修改成自己的 python的环境
//初始化Python环境
Py_Initialize();
//初始化Numpy
import_array();
// 将当前目录加入sys.path 这两行的意思是你的主目录位置:是在工程目录下因此要把.py文件放到该目录下!。也可以自己定义
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyRun_SimpleString("import os");
PyRun_SimpleString("print(os.listdir())");
//导入模块
PyObject* pModule = PyImport_ImportModule("candpython");
//导入函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "ff");
//数据准备
short* numpyptr = new short[90000000];
for (int i = 0; i < 90000000; i++)
{
short j = 1000;
numpyptr[i] = j;
}
npy_intp dims[2] = { 3000,30000 };//矩阵维度
PyObject* PyArray = PyArray_SimpleNewFromData(2, dims, NPY_SHORT, numpyptr);//将数据变为numpy
//用tuple装起来传入python
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyArray);
//函数调用(有返回值也是numpy
PyArrayObject* pRet = (PyArrayObject*)PyEval_CallObject(pFunc, args);
//返回的numpy矩阵的row和col
int Rows = pRet->dimensions[0], columns = pRet->dimensions[1];
cout << Rows << " " << columns << endl;
//将数据变回一般的指针
short* numpyptr2 = new short[90000000];
int j = 0;
for (int Index_m = 0; Index_m < Rows; Index_m++) {
for (int Index_n = 0; Index_n < columns; Index_n++) {
numpyptr2[j] = *(short*)(pRet->data + Index_m * pRet->strides[0] + Index_n * pRet->strides[1]);//访问数据,Index_m 和 Index_n 分别是数组元素的坐标,乘上相应维度的步长,即可以访问数组元素
j++;
}
}
cout << numpyptr2[1000] << endl;
//释放内存
Py_CLEAR(pModule);
Py_CLEAR(pFunc);
Py_CLEAR(PyArray);
Py_CLEAR(args);
Py_CLEAR(pRet);
delete[] numpyptr;
delete[] numpyptr2;
Py_Finalize(); // 释放资源
return 0;
}
Python代码:
import numpy as np
def ff(data):
print(data.shape)
print(data[0][0])
print(type(data[0][0]))
return data
利用numpy的方式不仅在传递速度上有很大的优势,并且可以与python完美的契合。
https://blog.csdn.net/qq_38232171/article/details/103955681
https://zhuanlan.zhihu.com/p/79896193
https://www.pythonf.cn/read/116854
以上是关于如何快速学习C++?的主要内容,如果未能解决你的问题,请参考以下文章