C++学习ING

这半年一直痛苦和犹豫着该怎么学好C++,现在终于有了答案:

早睡早起

http://www.zhihu.com/question/20634421 

每天早上花2小时左右学习C++

http://coolshell.cn/articles/2474.html

基础学习

http://coolshell.cn/articles/4990.html


图形学相关的博客

C++书籍

《C++ Primer》

《Effective C++》和《More Effective C++》

《C++沉思录》

《Exceptional C++》和《More Exceptional C++》

《Advanced C++》和《Modern C++》

《泛型编程与STL》

《深入探索C++对象模型》

实践任务

用C++实现一个BigInt,支持128位的整形的加减乘除的操作。
用C++封装一个数据结构的容量,比如hash table。
用C++封装并实现一个智能指针(一定要使用模板)。
《设计模式》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)
实践任务:
使用工厂模式实现一个内存池。
使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。
使用命令模式实现一个命令行计算器,并支持undo和redo。
使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。
学习STL的用法和其设计概念  - 容器,算法,迭代器,函数子。如果可能,请读一下其源码。
实践任务:尝试使用面向对象、STL,设计模式、和WindowsSDK图形编程的各种技能
做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。

学习C++的一些类库的设计,Boost, ACE,  CPPUnit,STL 


等完成万小时的训练再考虑下一步吧。

======================================================================================================

最佳线路:

1.写一个贪吃蛇

2.写网络模块,让贪吃蛇可以联网玩

3.把网络模块换成知名网络库,把代码移植到linux平台下,让全校人可以一起玩,发展成游戏平台

4.提供sdk给同学,让他们在游戏平台上开发一个连连看 

====================================================================================================== 

4.3日

一口气读完了C++primer4评注版后面的101条最佳实践准则,竟然能理解大半条款了。

4.5日:


2015年1.5日:

到现在为止还没靠C++赚到1毛钱,所以优先学习Python和Java了

======================================================================================================


### C++ 二分查找算法的实现与原理 #### 一、二分查找算法简介 二分查找是一种高效的查找算法,适用于有序数组中的目标值定。其核心思想是通过不断缩小搜索范围来减少比较次数,从而提高效率。该算法的时间复杂度为 \(O(\log n)\),相较于线性查找具有显著优势。 在实际应用中,二分查找通常用于解决以下问题: - 查找特定值是否存在。 - 找到第一个大于或小于某个值的置。 - 定最后一个等于某值的置等[^1]。 --- #### 二、C++ 非递归实现二分查找 以下是基于非递归方法的经典二分查找实现: ```cpp #include <iostream> using namespace std; int binarySearch(int arr[], int size, int target) { int left = 0; int right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; // 计算中间置,防止溢出 if (arr[mid] == target) { return mid; // 返回匹配索引 } else if (arr[mid] < target) { left = mid + 1; // 调整左边界 } else { right = mid - 1; // 调整右边界 } } return -1; // 如果未找到返回 -1 } int main() { int arr[] = {1, 3, 5, 7, 9}; int size = sizeof(arr) / sizeof(arr[0]); int target = 7; int result = binarySearch(arr, size, target); if (result != -1) { cout << "Element found at index: " << result << endl; } else { cout << "Element not found!" << endl; } return 0; } ``` 上述代码展示了如何利用 `while` 循环逐步调整左右指针完成查找过程。 --- #### 三、二分查找的关键点 1. **初始条件设置** 左指针初始化为数组起始置 (`left = 0`),右指针初始化为数组结束置 (`right = size - 1`)。 2. **终止条件判断** 当 `left > right` 时停止循环,表示当前范围内无满足条件的目标值[^2]。 3. **中间值计算** 使用 `(left + right) / 2` 或更安全的方式 `left + (right - left) / 2` 来避免潜在的整数溢出问题[^4]。 4. **边界的动态更新** 根据目标值与中间值的关系决定移动方向:如果目标值较大,则向右半部分继续搜索;反之则向左半部分搜索[^3]。 --- #### 四、扩展功能示例 除了基本的查找外,还可以进一步拓展二分查找的功能,比如寻找左侧边界或右侧边界。 ##### 寻找左侧边界 ```cpp template<typename T> int bsearch_left_bound(T arr[], int size, T value) { int left = 0, right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] >= value) { if (mid == 0 || arr[mid - 1] < value) { return mid; } else { right = mid - 1; } } else { left = mid + 1; } } return -1; } ``` ##### 寻找右侧边界 ```cpp template<typename T> int bsearch_right_bound(T arr[], int size, T value) { int left = 0, right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] <= value) { if (mid == size - 1 || arr[mid + 1] > value) { return mid; } else { left = mid + 1; } } else { right = mid - 1; } } return -1; } ``` 这些变体能够帮助处理重复元素的情况,分别找出第一次出现和最后一次出现的置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值