Git Product home page Git Product logo

changkun / modern-cpp-tutorial Goto Github PK

View Code? Open in Web Editor NEW
23.1K 637.0 2.9K 38.58 MB

📚 Modern C++ Tutorial: C++11/14/17/20 On the Fly | https://changkun.de/modern-cpp/

Home Page: https://changkun.de/modern-cpp/

License: MIT License

C++ 50.44% Makefile 7.72% C 0.35% Python 3.32% TeX 7.76% JavaScript 6.34% HTML 0.19% Dockerfile 0.39% Stylus 13.04% EJS 10.43%
cpp11 cpp14 cpp17 cpp20 modern-cpp cpp cpp-tutorial

modern-cpp-tutorial's Introduction

logo

Modern C++ Tutorial: C++11/14/17/20 On the Fly

Purpose

The book claims to be "On the Fly". Its intent is to provide a comprehensive introduction to the relevant features regarding modern C++ (before 2020s). Readers can choose interesting content according to the following table of content to learn and quickly familiarize the new features you would like to learn. Readers should be aware that not all of these features are required. Instead, it should be learned when you really need it.

At the same time, instead of coding-only, the book introduces the historical background of its technical requirements (as simple as possible), which provides great help in understanding why these features came out.

In addition, the author would like to encourage readers to use modern C++ directly in their new projects and migrate their old projects to modern C++ gradually after reading the book.

Targets

  • This book assumes that readers are already familiar with traditional C++ (i.e. C++98 or earlier), or at least that they do not have any difficulty in reading traditional C++ code. In other words, those who have long experience in traditional C++ and people who desire to quickly understand the features of modern C++ in a short period of time are well suited to read the book.

  • This book introduces, to a certain extent, the dark magic of modern C++. However, these magic tricks are very limited, they are not suitable for readers who want to learn advanced C++. The purpose of this book is offering a quick start for modern C++. Of course, advanced readers can also use this book to review and examine themselves on modern C++.

Start

You can choose from the following reading methods:

Code

Each chapter of this book contains a lot of code. If you encounter problems while writing your own code with the introductory features of the book, reading the source code attached to the book might be of help. You can find the book here. All the code is organized by chapter, the folder name is the chapter number.

Exercises

There are few exercises at the end of each chapter of the book. These are meant to test whether you have mastered the knowledge in the current chapter. You can find the possible answer to the problem here. Again, the folder name is the chapter number.

Website

The source code of the website of this book can be found here, which is built by hexo and vuejs. The website provides you another way of reading the book, it also adapts to mobile browsers.

Build

If you are interested in building everything locally, it is recommended using Docker. To build, simply run:

$ make build

Acknowledgements

This book was originally written in Chinese by Changkun Ou.

The author has limited time and language skills. If readers find any mistakes in the book or any language improvements, please feel free to open an Issue or start a Pull request. For detailed guidelines and checklist, please refer to How to contribute.

The author is grateful to all contributors, including but not limited to Contributors.

This project is also supported by:

Licenses

Creative Commons License
This work was written by Ou Changkun and licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. The code of this repository is open sourced under the MIT license.

modern-cpp-tutorial's People

Contributors

abu-co avatar ambiguoustexture avatar atomicvar avatar axionl avatar baixiangcpp avatar cathaysia avatar ccwanggl avatar certseeds avatar changdingfang avatar changkun avatar delta456 avatar dependabot[bot] avatar dw9 avatar fipped avatar frankhb avatar harryhaos avatar ibyte2011 avatar jyj407 avatar lucoiso avatar meisterluk avatar rholais avatar spartucus avatar stevenzscn avatar tianyishi2001 avatar timothy-liuxf avatar timothyye avatar trevor-vincent avatar umed avatar valmat avatar vvsxmja avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

modern-cpp-tutorial's Issues

a little code err in chapter 3.3

实际描述

  • 文件路径:book/zh-cn/03-runtime.md
  • 原文段落:
std::cout << "static_cast<T&&> 传参: ";
reference(std::forward<T>(v));

预期描述

std::cout << "static_cast<T&&> 传参: ";
reference(static_cast<T&&>(v));

附图

必要时,请附上相关截图

关于 weak_ptr 的描述感觉不是很严谨

std::weak_ptr 没有 * 运算符和 -> 运算符,所以不能够对资源进行操作,它的唯一作用就是用于检查 std::shared_ptr 是否存在,expired() 方法在资源未被释放时,会返回 true,否则返回 false

这里读起来的感觉更像是只有expired()方法,至少lock应该不只是有检查std::shared_ptr是否存在这一个作用

make to pdf

How to make to generate a single pdf not epub?

English translation and fluency

Actual Description

  • File Path: README.md & CONTRIBUTING.md

Some of the translations in this file can be improved:

  • sometimes the text in English is not clear,
  • some words are randomly capitalized,
  • the fluency of the text could be better

After checking #12, I saw a lot of good work was done, and in #87 some extra work is done, but I'd love to help out, starting with the README and CONTRIBUTING

Typo: 应用 -> 引用

实际描述

  • 文件路径:例如,book/zh-cn/03-runtime.md
  • 原文段落:
, 让编译器执行推导应用列表

预期描述

, 让编译器执行推导引用列表

附图

必要时,请附上相关截图

book/lambda: 建议补充被捕获对象生存期

Motivation

Please briefly describe your motivation.

Requirements

Please list all of your suggestions.


动机

请描述你提交内容建议的动机。

需求说明

请描述你提交内容建议的详单,例如具体是增加哪个知识点的说明。

第2章词语搭配&Typo

那么 `foo(NULL);` 这个语句将会去调用 `foo(int)`,从而导致代码违反直观。

违反与直观搭配似乎不太合适

违反 直觉
违反(直观的)印象


> 注意,现在大部分编译器其实都带有自身编译优化,很多非法行为在编译器优化的加持下回变得合法,若需重现编译报错的现象需要使用老版本的编译器。

回 / 会


> 这个方法需要之后介绍的知识,读者可以简单阅读以下,将这个代码段保存,在后面的内容了解过了之后再回过头来阅读此处方法会大有收获。

以下 / 一下

auto func(auto a,auto b)

#include <iostream>
using namespace std;
auto func1(auto a,auto b){
    return a+b;
}
int main(){
    cout<<func1(1,2)<<'\n';
    return 0;
}

gcc 7.3 compile success.

一处代码例子语法错误

第二章 语言可用性的强化
折叠表达式一节

template<typename ... T>
auto sum(T ... t) {
    return (t + ...)
}

return语句缺少结束分号

内容检阅

  • 将仓库内容结构进行整理
  • 将 markdown 文件迁移到此仓库
  • 内容维护
  • 增加 alignas 内存对齐、atomic 内存模型、无限制联合等 C++11/14 的特性
  • 增加习题及参考答案

Added English Translation

Can you guys please support English translation because it would become famous and not everyone knows Chinese here.

You may mean itr2

// 需要重新定义一个新的变量
const std::vector::iterator itr2 = std::find(vec.begin(), vec.end(), 3);
if (itr != vec.end()) {
*itr2 = 4;
}

看完全书之后的一些希望作者补充细化的点

动机

看完了整本pdf,作为有C++98基础,新接触C++1z的新手,对于很多内容一开始都感到疑惑,自己另外查了很多资料才逐渐明白,建议作者把以下几点再丰富一下

需求说明

  1. 左值引用和右值引用:常量左值引用为什么能引用右值?这是历史遗留问题,见为什么常量左值引用可以绑定到右值? - 邱昊宇的回答 - 知乎
  2. auto&&在for循环中为什么约定俗成这样,而不是auto&:auto&&是转发引用,这是使用范围 for 循环的最安全方式。与auto&区别在于能保留原m中元素的左右值类型。见引用声明
  3. forward和move实现方式:书里“完美转发”章节的末尾一句话 “从现象上来看,std::forward(v) 和 static_cast<T&&>(v) 是完全一样的。”包含的信息量极大,在初看之时完全无法理解,怎么能做到一个语句就针对两种类型的v返回对应的值,而不是有判断/重载之类的呢?在看了别人的博客研究了forward的源码之后才明白核心在于这个T的类型推断,传进左值和传进右值T是不同的,进而强制转换中T&&的推断结果也不同,十分精妙,而书中完全没有点破这一关键点。见C++11:std::move和std::forward源码分析
  4. 另外,第二章的变长参数列表遍历方法第二种,利用的std::initializer_list也忘记在后面介绍了,希望补上,因为我到现在还没看懂那段代码

Possible English typos

   p8  amzed -> amazed?

  p10 Deprecation is not completely unusable, it is only intended to imply that programmers
      will disappear from future standards and should be avoided.
 -> I am not a native English speaker, but I think "programmers" above should be
         "features" or something like this.

  p10 cpp char *str = "hello world!"; // A deprecation warning will appear
      -> Isn't "cpp" unnecessary (and wrong)?

  p12 (CXX)(SOURCE_CXX) (OBJECT SC )(LDFLAGS_COMMON) -o (TARGET)clean : rm − rf ∗ .o(
      TARGET) -> I think "clean" make target should be on a separate line. Plus, $ should
      prefix the parentheses, like $(CXX).


 p16 so even if this behavior is in most compilers Both support, but
     -> so even if this behavior is supported by most compilers, but

 p16 This keyword explicitly tells the compiler that it should verify that len_foo should be
     a compile time. Constant expression. -> a compile time constant expression.

 p17 which causes us to rename the other when we need to traverse the entire std::vectors
     again. A variable. -> I guess "A variable" should be deleted or appended earlier "rename the other
     variable when".

 p18 which is The initialization of class -> which is the initialization of class
     (Note that this kind of abrupt capitalisations are fairly common.)

 p32 Line 15 // inhereit constructor => inheritance constructor

 p36 but you don’t want to use a function to name a function -> I guess the following is
     better/more correct: "but you don’t want to use name to call a function"

 p36 for the things in [catch list] -> for the things in [capture list]

 p39 Although this part of the standard library is part of the standard library =>
     I guess the following is better/more correct:
     Although the features are part of the standard library and not found in runtime,

 p41 that is, A value => that is, a value

 p42 Line 24: // string,string,string, => string,string,string,string

 p45 reference contraction rule => I guess "reference collapsing rule" is a better name.

 p53 except for std::pair There seems to be => there (Not capital T).

 p55 , eliminating the display call delete, => , eliminating to call delete,

 p57 Line 35: "p2 was destroied" => "p2 was destroyed"

 p57 Line 40: destroied => destroyed

 p58 Line 11: destroied => destroyed

 p58 Line 18: destroied => destroyed

 p58 no The way => no way

 p59 Figure 2: Untranslated word, Chinese?

 p66 std::lock_gurad => std::lock_guard

 p66 RAII guarantees the exceptional security of the code while losing the simplicity of the code.
     => I guess here you are promoting RAII and the following is better:
     RAII guarantees the exceptional security of the code while keeping the simplicity of the code.

 p69 notd_one() of std ::condition_variable is used to wake up a thread =>
     notify_one() of std ::condition_variable is used to wake up a thread

 p71 Intuitively, a = 5;int2seems => Intuitively, a = 5; seems

Many thanks to Oguz Kupusoglu.

第三章将亡值解释错误

实际描述

  • 文件路径:例如,book/zh-cn/02-usability.md
  • 原文段落:
将亡值(xvalue, expiring value),是 C++11 为了引入右值引用而提出的概念(因此在传统 C++中,纯右值和右值是同一个概念),也就是即将被销毁、却能够被移动的值。

将亡值可能稍有些难以理解,我们来看这样的代码:
std::vector<int> foo() {
    std::vector<int> temp = {1, 2, 3, 4};
    return temp;
}

std::vector<int> v = foo();

原文解释如下
http://naipc.uchicago.edu/2015/ref/cppreference/en/cpp/language/value_category.html
A function call expression, if the function's return type is an rvalue reference to object type, such as std::move(val)
A cast expression to an rvalue reference to object type, such as static_cast<T&&>(val) or (T&&)val
a non-static class member access expression, in which the object expression is an xvalue
A pointer-to-member expression in which the first operand is an xvalue and the second operand is a pointer to data member.

将亡值可能稍有些难以理解,我们来看这样的代码:
std::vector<int> foo() {
    std::vector<int> temp = {1, 2, 3, 4};
    return std::move(temp);
}

std::vector<int> v = foo();

附图

必要时,请附上相关截图

第2章 constexpr 文字错误

C++11 提供了 constexpr 让用户显式的声明函数或对象构造函数在编译器会成为常量表达式...

“编译器” -> “编译期”

zh-cn/07-thread: typo in memory order acquire

Actual Description

  • File Path: for example, book/en-us/02-usability.md
  • Original paragraph:
A copy of the original paragraph

Expected Description

A modified paragraph

Attachments

Attach screenshot or files if necessary.


实际描述

3. 释放/获取模型:在此模型下,我们可以进一步加紧对不同线程间原子操作的顺序的限制,在释放 std::memory_order_release 和获取 std::memory_order_acquire 之间规定时序,即发生在释放操作之前的所有写操作,对其他线程的任何获取操作都是可见的,亦即发生顺序(happens-before)。

可以看到,std::memory_order_release 确保了它之后的写行为不会发生在释放操作之前,是一个向后的屏障,而 std::memory_order_acquire 确保了它之后的前的写行为,不会发生在该获取操作之后,是一个向前的屏障,对于选项 std::memory_order_acq_rel 而言,则结合了这两者的特点,唯一确定了一个内存屏障,使得当前线程对内存的读写不会被重排到此操作的前后。

预期描述

而 std::memory_order_acquire 确保了它之后的前的写行为 此处描述错误

而 std::memory_order_acquire 确保了它之前的写行为

附图

必要时,请附上相关截图

第 3 章 语言运行期的强化 完美转发中std::move结果应该是右值

输出结果为:

传递右值:
普通传参:左值引用
std::move 传参:右值引用
std::forward 传参:右值引用
传递左值:
普通传参:左值引用
std::move 传参:右值引用
std::forward 传参:左值引用

无论传递参数为左值还是右值,普通传参都会将参数作为左值进行转发,所以 std::move 总会接受到一个左值,从而转发调用了reference(int&&) 输出右值引用。

std::move 总会接受到一个左值 ,但从上面的结果来看应该是右值吧?

seems OK

Actual Description

  • File Path: for example, book/en-us/02-usability.md
  • Original paragraph:
A copy of the original paragraph

Expected Description

A modified paragraph

Attachments

Attach screenshot or files if necessary.


P37
image

在 C++11 之后,编译器为我们做了一些工作,此处的左值 temp 会被进行此隐式右值转换,等价于 static_cast<std::vector &&>(temp),进而此处的 v 会将 foo 局部返回的值进行移动。也就是后面 我们将会提到的移动语义。
——————————————————————

这里并不会调用移动语义,而是由编译器直接进行了return value optimization。
只有你return std::move(temp)才会调用移动语义。

decltype相关内容有误

实际描述

  • 文件路径:book/zh-cn/02-usability.md
  • 原文段落:
decltype 关键字是为了解决 auto 关键字只能对变量进行类型推导的缺陷而出现的。它的用法和
sizeof 很相似

预期描述

decltype 关键字是为了解决 auto 关键字只能对变量进行类型推导的缺陷而出现的。它的用法和
typeof 很相似

附图

必要时,请附上相关截图

第二章 2.3类型推导 auto示例代码有误

实际描述

  • 文件路径:例如,book/zh-cn/02-usability.md
  • 原文段落:
auto i = 5;              // i 被推导为 int
auto arr = new auto(10); // arr 被推导为 int *

预期描述

auto i = 5;              // i 被推导为 int
auto arr = new int(10); // arr 被推导为 int *

附图

必要时,请附上相关截图
屏幕快照 2019-04-23 11 18 33

第二章习题404

实际描述

  • 文件路径:book/zh-cn/02-usability.md
  • 原文段落:
参考答案[见此](../exercises/2)。

预期描述

点击”见此“应该跳到答案链接

附图

必要时,请附上相关截图
image

右值引用举例错误

实际描述

  • 文件路径:例如,book/zh-cn/02-usability.md
  • 原文段落:
// 防止编译器优化
A return_rvalue(bool test) {
    A a,b;
    if(test) return a;
    else return b;
}

预期描述

a,b是左值,不是右值,上面的代码会调用拷贝构造函数,不是移动构造函数,如果
要掉用移动构造,需要调用std::move()将左值转成右值

// 防止编译器优化
A return_rvalue(bool test) {
    A a,b;
    if(test) return std::move(a);
    else return std::move(b);
}

附图

必要时,请附上相关截图

有关 void * 的表述

在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。

且不论“编译器”定义 NULL 的说法来源是什么,“传统 C++”是指 ISO C++ 之前的(如由 Annotated Reference Manual 定义的) C++ 还是 ISO C++11 以前的 C++ ?指代不明。

注意 http://eel.is/c++draft/support.types.nullptr#footnote-187 是在什么时候引入的,烦请重新校对内容质量。

隐式转换到其他类型(换句话说,void * 并不属于 C++ 语言的一部分)

依据?

Support Continues Integration

Motivation

This repo has supported many different types of reading approach.
It is little bit tragedy because it does not support CI deployment yet.
I am current suffering manually deploy the website to my private server.
Therefore it seems necessary to set up automatic CI service into this repo.

Requirements

  • Use Travis CI (or GitHub Action?)
  • Automatic build website & deploy to changkun.de/modern-cpp
  • Automatic build PDFs & release it in release

9.2 noexcept部分代码或许存在问题

9.2 noexcept 修饰完一个函数之后能够起到封锁异常扩散的功效,如果内部产生异常,外部也不会触发。

我的理解是不会触发异常而执行catch中的代码,
如果我的理解正确的话:

之后给出的代码好像并不能体现出这一特性,

没有noexcept修饰符的my_throw()抛出了异常,但执行了catch中的代码
2,没有noexcept修饰符的non_block_throw()抛出了异常,也执行了catch中的代码
3,具有noexcept修饰符的block_throw()函数并没有抛出异常,当然也没有触发catch中的代码
4,于是我自做主张为my_throw() 增加了noexcept操作符使其声明变为
void may_throw() noexcept
这样的情况下:
4-1,编译器会发出警告( warning C4297: “may_throw”: 假定函数不引发异常,但确实发生了)
以及(note: 在函数上指定了 __declspec(nothrow)、throw()、noexcept(true)或 noexcept)(vs2017)
4-2,运行期间,程序直接异常退出。与我理解相反地,这个异常不能被try...catch语句捕捉,或许这才
你所要表达的“如果内部产生异常,外部也不会触发(try...catch语句)。”?

Host PDF version on website

Motivation

PDFs are large files that usually shouldn't be considered as a committed file to a git repository.
This repo initially committed all PDFs because they are reasonably small and light.

Requirements

  • Add "Content may outdated" Warning in the PDF.
  • Change script to let PDFs move to the website build folder.
  • Add Download button on website
  • Change README.md links to the PDF file.

提问:什么情况下需要手动释放 std::vector 中资源

...相比堆内存中的 std::vector,我们就能够灵活的访问这里面的元素,从而获得更高的性能;同时正是由于其堆内存存储的特性,有些时候我们还需要自己负责释放这些资源。https://github.com/changkun/modern-cpp-tutorial/blob/master/book/zh-cn/04-containers.md

我问过一些人,都是回答我释放资源是 std::vector 析构函数自动完成的,不需要手动释放。

请问什么时候需要手动释放?

我想了想,是说元素是指针的情况吗?

Need more elaboration on "constexpr" and "const"

The following code in 2.02.constexpr.cpp:

    int len = 10;
    const int len_2 = len + 1;
    char arr_4[len_2];

seems non-standard, because the const integral type len_2 can be treated as a constant expression only if it is initialized by a constant expression, but len + 1 is not a constant expression, so len_2 is NOT a constant expression (despite the fact that it is a const variable), and thus it cannot be used to specify the size of an array. However, both gcc and clang allow arrays of variable length as an extension, but as for a tutorial for C++11/14/17 standard, this kind of behavior should not be encouraged. Also, if you add -pedantic option to clang, a warning should be generated.

I really love to see more elaborations on the relationship between const and constexpr as it would easily confuse anyone new to modern C++. Personally I like the top answer in this question https://stackoverflow.com/questions/14116003/difference-between-constexpr-and-const, so it would be really nice if you could incorporate some of the content in the tutorial.

By the way, I've learned a lot from your tutorial. So thank you and keep up the good work!

missing something?

In decltype(auto) section, miss something?

std::string lookup1(std::string &str) {
return
}
std::string& lookup2();

Add C++20 Supports

需要支持以下内容:

  • 语言级 bug 与修订
  • 类型系统改进 Type Punning
  • 弃用和删除的功能
    • register
    • std::auto_ptr --> std::unique_ptr
    • std::random_shuffle
    • std::bind1st, std::bind2nd, ...
  • 语言增强
  • 结构化绑定 Structured bindings
  • 新的控制结构 constexpr if
  • 编译时条件语句 Compile-time conditional statements
  • 新的聚合规则
  • 强制性 RVO 和复制 elision, Guaranteed copy elision
  • Unary static_assert
  • 嵌套命名空间 Nested namespace deinitions
  • inline 变量 inline variables
  • constexpr 改进, constexpr lambda
  • 模板增强
  • 折叠表达式 Fold expressions
  • 类模板参数推导 Class template deduction
  • variadic templates fold
  • auto non-type template parameters
  • Preprocessor predicate for header testing
  • 容器
  • std::string_view, std::byte 加入 container 容器一章
  • std::any, std::variant, std::optional 加入 container 容器一章
  • 容器改进
  • 线程
  • 文件系统
  • 数学库
  • 其他特性
  • Polymorphic allocators and memory resources
  • Aligned new
  • Improved insertion and splicing for associative constrainers
  • Boolean logic metafunctions
    ...
  • 展望 C++20
  • concept
  • module
  • coroutine
  • Ranges

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.