当前位置: 首页 > ai >正文

CppCon 2017 学习:C++ in Academia

这段内容总结了几个现代C++课程和学习资源的特点,尤其聚焦于CS 1410和CS 3370两个课程,以及Zybooks的在线C++教材。帮你提炼和整理一下重点,方便理解和对比:

Modern C++ in CS 1410

  • 重点特性:
    • 早期的 std::vectorstd::string
    • Range-based for 循环(简化遍历)
    • 统一初始化语法(uniform initialization)
    • 对象管理
      • “Big 3” (拷贝构造函数、拷贝赋值运算符、析构函数)
      • 基础的 RAII(资源获取即初始化)
      • =default=delete(显示默认和删除函数)
      • 类内初始化器(in-class initializers)
      • override 关键字

Zybooks C++ Online Book

  • 特点:
    • 自包含的在线教材,带动画、交互式练习、测验
    • 内置开发环境,无需安装IDE
    • 自动评分
  • 缺点:
    • 内容主要是C++98标准,现代C++特性较少

Project-Based Learning (PBL) in CS 3370 (Intermediate/Advanced C++)

  • 结构:
    • 模块化课程,每个模块配套一个项目
    • 项目在模块初期介绍
    • 课程内容围绕完成项目展开
    • 每个项目有评分标准(rubric)
  • 模块内容举例:
    | 模块主题 | 涉及内容 | 项目示例 |
    | -------------------------- | ----------------------------------------------------------------- | ------------------------------------- |
    | Memory Management I | lvalues/rvalues,指针和const,new/delete,引用,auto,decltype,=delete | 简单的双端队列(deque) |
    | Memory Management II | 自定义new/delete,RAII,智能指针,placement new,reinterpret_cast | 基于类的内存池 |
    | Strings, Files, Exceptions | 字符串流,流状态,文件I/O,异常安全 | XML解析器,随机访问记录文件 |
    | Algorithms | <algorithm><numeric>,函数对象,lambda,bind,迭代器 | 科学数据分析 |
    | Containers | 所有标准容器,严格弱序,自定义比较器 | 交叉引用生成器 |
    | Operator Overloading | 位运算符,移动语义 | 位数组(bitarray,如boost::dynamic_bitset) |
    | Concurrency | <thread><future><mutex><atomic><condition_variable> | 管道架构程序 |

每个模块主题对应的一个简化版代码示例,帮你快速感受下核心点:

1. Memory Management I

主题: lvalues/rvalues,指针和const,new/delete,引用,auto,decltype,=delete
示例:简单双端队列(deque)插入操作

#include <iostream>
class SimpleDeque {int* data;            // 动态数组存储数据size_t capacity;      // 容量size_t frontIndex;    // 队头索引size_t backIndex;     // 队尾索引
public:SimpleDeque(size_t cap) : capacity(cap), frontIndex(cap / 2), backIndex(cap / 2), data(new int[cap]) {}// 构造函数,初始化容量和索引,数组从中间开始,方便两端操作~SimpleDeque() { delete[] data; }  // 析构释放内存void push_front(int val) {if (frontIndex == 0) { std::cerr << "Deque full at front\n"; return; } // 防止越界data[--frontIndex] = val;  // 插入到队头}void push_back(int val) {if (backIndex == capacity) { std::cerr << "Deque full at back\n"; return; } // 防止越界data[backIndex++] = val;  // 插入到队尾}void print() {for (size_t i = frontIndex; i < backIndex; ++i)std::cout << data[i] << " ";  // 输出所有有效元素std::cout << "\n";}
};
int main() {SimpleDeque d(10);   // 创建容量为10的双端队列d.push_back(1);      // 从队尾插入1d.push_front(0);     // 从队头插入0d.push_back(2);      // 从队尾插入2d.print();           // 输出:0 1 2
}

2. Memory Management II

主题: 自定义new/delete,RAII,智能指针,placement new,reinterpret_cast
示例:简单内存池(只示意RAII和自定义new/delete)

#include <iostream>
#include <memory>
class PoolObject {static char pool[1024];  // 预分配内存池static size_t offset;    // 当前分配偏移量
public:int x;// 重载new,从内存池分配内存static void* operator new(size_t size) {if (offset + size > sizeof(pool)) throw std::bad_alloc();  // 超出池大小抛异常void* ptr = pool + offset;offset += size;std::cout << "Allocating from pool\n";return ptr;}// 重载delete,这里不释放内存,只是示意static void operator delete(void* ptr, size_t size) {std::cout << "Dealloc called (noop in pool)\n";// 真实释放逻辑省略,内存池通常统一回收}
};
char PoolObject::pool[1024];  // 定义内存池数组
size_t PoolObject::offset = 0;
int main() {PoolObject* p1 = new PoolObject();  // 从池中分配p1->x = 42;std::cout << p1->x << "\n";         // 输出42delete p1;                          // 调用重载的delete(无实际释放)
}

3. Strings, Files, Exceptions

主题: 字符串流,文件I/O,异常安全
示例:读取文件并捕获异常

#include <iostream>
#include <fstream>
#include <sstream>
int main() {try {std::ifstream file("test.txt");  // 打开文件if (!file) throw std::runtime_error("Cannot open file");  // 文件打开失败抛异常std::stringstream buffer;buffer << file.rdbuf();  // 读取整个文件内容到字符串流中std::cout << buffer.str() << "\n";  // 输出文件内容} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << "\n";  // 捕获并打印异常信息}
}

4. Algorithms

主题: <algorithm>, <numeric>, lambda,bind
示例:使用std::accumulate和lambda

#include <iostream>
#include <vector>
#include <numeric>  // std::accumulate
int main() {std::vector<int> v{1, 2, 3, 4, 5};// accumulate对区间求和,初值0,lambda表达式表示加法int sum = std::accumulate(v.begin(), v.end(), 0, [](int a, int b) { return a + b; });std::cout << "Sum = " << sum << "\n";  // 输出15
}

5. Containers

主题: 标准容器,自定义比较器
示例:用std::set自定义排序

#include <iostream>
#include <set>
// 反转排序比较器,greater变成升序变降序
struct ReverseOrder {bool operator()(int a, int b) const { return a > b; }
};
int main() {std::set<int, ReverseOrder> s = {3, 1, 4, 1, 5};// set自动去重,按ReverseOrder排序for (int x : s) std::cout << x << " ";  // 输出: 5 4 3 1
}

6. Operator Overloading

主题: 位运算符,移动语义
示例:简单位数组类重载位运算符

#include <iostream>
class BitArray {unsigned int bits;
public:BitArray() : bits(0) {}BitArray(unsigned int b) : bits(b) {}// 重载&运算符,实现按位与BitArray operator&(const BitArray& other) const {return BitArray(bits & other.bits);}// 打印二进制位(32位)void print() {for (int i = 31; i >= 0; --i)std::cout << ((bits >> i) & 1);std::cout << "\n";}
};
int main() {BitArray a(0b1100);BitArray b(0b1010);BitArray c = a & b;  // 位与结果0b1000c.print();           // 输出00000000000000000000000000001000
}

7. Concurrency

主题: <thread>, <mutex>, <atomic>
示例:线程安全计数器

#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0);  // 原子计数器,线程安全
void worker() {for (int i = 0; i < 1000; ++i) {++counter;  // 原子递增}
}
int main() {std::thread t1(worker);std::thread t2(worker);t1.join();  // 等待线程结束t2.join();std::cout << "Counter: " << counter.load() << "\n";  // 输出2000
}

这里提到了学校里其他用到C++的课程,以及一些现实中的挑战,比如:

  • 课程中用C++的方向很广:数值计算(3320),设计模式(3450),计算机体系结构(4380,写虚拟机和汇编),编程语言(4450),AI(4470),编译原理(4490)等。
  • 都是CS学位必修课,C++作为核心技能被广泛应用。
  • 你还提到了学习资源的问题:
    • 需要可访问的、支持C++17的新材料,且最好是免费的在线资源,不一定要纸质书。
    • 需要涵盖GUI开发、Web开发等常见开发场景的库和工具。
    • 希望有跨平台、易用的IDE,最好是云端,但云端IDE一般对GUI开发支持不好。
http://www.xdnf.cn/news/14470.html

相关文章:

  • 【开源解析】基于Python+Qt打造智能应用时长统计工具 - 你的数字生活分析师
  • 鼎捷T100开发语言-Genero FGL 终极技术手册
  • Mac OS上安装Redis
  • Python 正则表达式
  • 解决戴尔电脑No bootable devices found问题
  • TIA Portal (博图) 中 SCL 语言 REPEAT_UNTIL循环语句的用法介绍及案例
  • 资源占用多,Linux 系统中如何降低 CPU 资源消耗并提升利用率?
  • CentOS 7 虚拟机网络配置异常 典型问题:启动了NetworkManager但是network无法启动
  • 03.【C语言学习笔记】分支和循环
  • 网络层协议 IP 协议介绍 -- IP 协议,网段划分,私有 IP 和 公网 IP,路由
  • 设计模式笔记_创建型_单例模式
  • 【图像处理入门】9. 基础项目实战:从去噪到图像加密
  • 接口适配器模式实现令牌桶算法和漏桶算法
  • 加密、加签、摘要算法对比
  • 自然语言处理【NLP】—— CBOW模型
  • 浅谈快排的退化与优化
  • 鼠标报告描述符与对应的数据结构体
  • 实现汽车焊装线设备互联:DeviceNet与Modbus TCP协议转换网关
  • Debian 编译安装 ruby3.2
  • stm32使用定时器PWM
  • Linux编程:4、进程通信-管道(匿名管道)
  • 二手商城系统+SpringBoot + Vue (前后端分离)
  • 通用embedding模型和通用reranker模型,观测调研
  • 嵌入式学习笔记C语言阶段--17共用体和枚举
  • LG P4278 带插入区间K小值 Solution
  • SCADA|KingSCADA通过组合框选择修改变量的值
  • JS进阶 Day04
  • 2GT 环形闭口闭环同步带一种具有特定齿形和结构的传动带
  • MotleyCrew ——抛弃dify、coze,手动搭建多agent工作流
  • Cangejie Magic智谱AI文生图API实战详解