我想涵盖相当于典型的 CS 本科生课程的材料,因此我列出了涵盖典型主题的书籍清单。我已将列表分成几个主题,根据我所做的研究,我认为这些主题是强制性的和可选的。我需要一些帮助来确认主题是否正确拆分,以及书籍是否具有正确的级别。另外,如果我遗漏了任何重要的主题,或者任何超出了本科水平,请告诉我。
感谢您的时间!
关于暂停状态的编辑:我不认为这个问题是题外话,因为我不是在要求推荐书籍 - 我是问我列出的主题是否表明典型的 CS 课程,以及是否有任何重要的主题缺失。书籍链接仅在我选择的书籍与主题不正确的情况下才存在,并且可以在必要时删除。
强制性的
操作系统:操作系统概念
离散数学:具体数学
数据结构与算法:算法导论
计算机体系结构:计算机系统:程序员的视角
Compilers: Engineering a Compiler被推荐给我而不是龙书。
数据库理论:数据库系统导论
编程语言概念与设计:编程语言语用学
可选的
密码学:密码学工程:设计原理和实际应用
函数式编程:向你学习 Haskell 的好处!
人工智能:人工智能:一种现代方法
计算机图形学:实时渲染
我正在编写一个需要占据平方根的程序.由于我采用平方根的值是正数,我只是将其转换为int.所以说以下示例:
int i = 16;
int j = std::sqrt(i)
Run Code Online (Sandbox Code Playgroud)
j应为4.
我想知道,是否有可能sqrt返回3.9999999991而不是4.000000001或其他什么,j的结果是3?是否有定义浮点行为的规则?我怎样才能正确地将其转换为int?
我正在尝试编写C ++ 11链表实现,链表是模板类,其节点是嵌套类,如下所示:
template <typename T>
class LinkedList {
public:
class Node;
std::shared_ptr<Node> listSearch(const T &input) const;
private:
std::shared_ptr<Node> head;
std::shared_ptr<Node> tail;
};
template <typename T>
class LinkedList<T>::Node {
private:
T data;
std::shared_ptr<Node> next;
}
Run Code Online (Sandbox Code Playgroud)
我假设Node类本身不是模板,但是当LinkedList实例化时,它也会创建Node类。
当我尝试如下定义listSearch函数时,出现错误:“模板类型参数的模板参数必须是类型;您忘记了'typename'吗?”。有人可以解释什么地方不对吗?
template <typename T>
std::shared_ptr<LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) { ... }
Run Code Online (Sandbox Code Playgroud)
编辑:
好的,所以我重新编译了gcc,错误消息更加清晰了。它需要以下内容:
std::shared_ptr<typename LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) const { ... }
Run Code Online (Sandbox Code Playgroud)
为什么在LinkedList :: Node之前需要类型名?这种类型不是很明显吗?
我目前正在创建一个类,我希望每次创建对象时,其中一个私有成员都会使用随机数进行初始化.以下代码没有问题:
private:
unsigned random = rand() % 10;
Run Code Online (Sandbox Code Playgroud)
但是,我想使用C++ 11随机引擎和发行版来做到这一点.我希望能够按照以下代码执行某些操作,这些代码将无法编译,但会对我正在尝试执行的操作有一个大概的了解:
private:
unsigned random = distribution(mersenne_generator(seed));
static std::random_device seed_generator;
static unsigned seed = seed_generator(); //So that it's not a new seed each time.
static std::mt19937 mersenne_generator;
static std::uniform_int_distribution<unsigned> distribution(0, 10);
Run Code Online (Sandbox Code Playgroud)
这段代码不会编译,因为我试图在类中定义一些静态成员.但是,我不确定在哪里定义它们.我可以创建一个初始化所有内容的成员函数,但是我必须在main中运行它,我不想这样做.我想整理出类中的所有随机定义,这样当我在main中创建一个对象时,它将隐式创建随机数.有什么建议?
下面的代码显示了我的测试用例.我用clang ++ --std = c ++ 11 -O2和g ++ --std = c ++ 11 -O2编译了两者.
long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
ary[i] = i;
Run Code Online (Sandbox Code Playgroud)
std::vector<long long> vec(100000000, 0);
for (long long i = 0; i < 100000000; ++i)
vec[i] = i;
Run Code Online (Sandbox Code Playgroud)
对于我来说,我只进行了初始化测试,然后是初始化和for循环.结果如下:
GCC:
铛:
gcc结果与传统认为向量与数组一样快.而且,矢量的clang和gcc结果非常一致.然而,铿锵声的结果是荒谬的,阵列表现得相当快.任何人都知道为什么会这样?
可以理解,编译器将不允许以下内容:
const int ci = 1000;
int &r = ci;
Run Code Online (Sandbox Code Playgroud)
因为这意味着我可以尝试通过r来改变ci的值,但ci是const.
为什么然后允许以下内容,除了首先为r分配非const int之外,它与上面相同?
int i;
const int ci = 1000;
int &r = i;
r = ci;
Run Code Online (Sandbox Code Playgroud)
如果您尝试通过r更改ci,则ci将保持相同的值.然而,与第一个示例不同,它不会被编译器捕获.对此有解释吗?
对于像这样的表达式
x = a ? b : c ? d : e;
Run Code Online (Sandbox Code Playgroud)
我理解,因为?:运算符具有正确的关联性,所以表达式被分组为
x = a ? b : (c ? d : e);
Run Code Online (Sandbox Code Playgroud)
但是,评估顺序呢?结合性是否意味着首先评估(c?d:e)分支,然后它的答案作为参数传递给左?:运算符?或者首先进行评估,然后根据返回b或评估(c?d:e)分支?还是未定义?