在这个属于我们的节日——1024程序员节,我想与大家分享我的编程之旅,特别是我学习C++的经历。同时,我也想借此机会,祝愿自己和大家在未来的编程道路上,再也不会遇到BUG。
我的编程之旅始于对技术的好奇和对解决问题的渴望。记得第一次接触编程是在大一暑假的课上,那时我们学习了基础的Python。虽然只是简单的语法和逻辑,但我被编程的魅力深深吸引。从那时起,我就知道,我将与代码结下不解之缘。
2023年底中国程序员群体的人数已攀升至2067.21万,增速达到2.5%。而另一些报告则指出,中国程序员总数约为600万至700万不等。这些差异可能源于统计方法和数据来源的不同。但无论如何,中国都是全球程序员数量最多的国家之一。
全球范围内,不同编程语言的程序员数量也存在显著差异。以下是一些当下的编程语言排行榜。
不同编程语言的特点 没有最好的语言,只有最合适的语言,程序员擅长用不同的语言解决不同的问题,以下是一些常见语言的特点:
编程语言 | 使用人数/活跃开发者数量(估计值) |
---|---|
Python | 约1820万开发者(另有说法认为其已成为使用量最大的编程语言) |
Java | 约2520万活跃开发者(需求量依然强劲,且增长主要来自有经验的开发者) |
JavaScript/TypeScript | 需求量极大,DevJobsScanner统计显示有91.5万份相关职位需求(2022年1月至2023年5月),是需求量最大的编程语言 |
C++ | TIOBE排行榜中排名第二,社区活跃度和项目运用情况良好 |
C | 曾被誉为“编程语言之母”,但现已跌至TIOBE排行榜第四位 |
C# | 需求量稳定,DevJobsScanner统计显示有37.5万份相关职位需求 |
Go | 约470万开发者,因其简化的并发处理和全面的标准库在后端服务中广泛使用 |
Rust | 用户群在过去两年中几乎翻了一番,到2024年初达到400万开发者,因其性能和内存安全特性受到青睐 |
PHP | 需求量第五大的编程语言,主要用于Web开发 |
Ruby | 排名较稳定,有一定数量的工作岗位需求 |
大学时,我选择了计算机科学作为我的专业。在众多编程语言中,我选择了C++作为我的主攻方向。C++以其性能高效、应用广泛而闻名。它既能让我深入理解计算机的工作原理,又能让我在游戏开发、系统编程等领域大展身手。
在学习C++的过程中,我遇到了许多挑战。比如,理解指针和内存管理的概念,掌握复杂的模板编程,以及调试那些难以发现的BUG。但正是这些挑战,让我的技术更加精湛,让我对编程有了更深的理解。
#pragma once
#include<iostream>
#include<algorithm>
using namespace std;
// 搜索二叉树结点定义
template<class K>
struct BSTreeNode
{
BSTreeNode<K>* _left;
BSTreeNode<K>* _right;
K _key;
// 构造函数
BSTreeNode(const K& key)
:_left(nullptr)
,_right(nullptr)
,_key(key)
{}
};
// 简易版搜索二叉树实现 递归版
template<class K>
class BSTree
{
typedef BSTreeNode<K> Node;
public:
// 构造函数
BSTree()
:_root(nullptr)
{}
// 搜索二叉树拷贝构造
BSTree(const BSTree<K>& t)
{
_root = Copy(t._root);
}
// 搜索二叉树赋值
BSTree<K>& operator=(BSTree<K> t)
{
swap(_root, t._root);
return *this;
}
// 析构函数
~BSTree()
{
Destroy(_root);
}
// 搜索二叉树的插入
bool insert(const K& key)
{
return _insert(_root, key);
}
// 搜索二叉树的查找
bool find(const K& key)
{
return _find(_root, key);
}
// 搜索二叉树的删除
bool erase(const K& key)
{
return _erase(_root, key);
}
// 搜索二叉树中序打印
void InOrder()
{
_InOrder(_root);
cout << endl;
}
private:
// 拷贝构造子函数
Node* Copy(Node* root)
{
if (root == nullptr)
return nullptr;
Node* copyroot = new Node(root->_key);
copyroot->_left = Copy(root->_left);
copyroot->_right = Copy(root->_right);
return copyroot;
}
// 搜索二叉树析构子函数
void Destroy(Node*& root)
{
if (root == nullptr)
return;
Destroy(root->_left);
Destroy(root->_right);
delete root;
root = nullptr;
}
// 搜索二叉树删除子函数
bool _erase(Node*& root, const K& key)
{
// 搜索二叉树为空树
if (root == nullptr)
return false;
if (root->_key < key)
{
return _erase(root->_right, key);
}
else if (root->_key > key)
{
return _erase(root->_left, key);
}
else
{
Node* del = root;
// 搜索二叉树的左子树为空
if (root->_left == nullptr)
{
root = root->_right;
}
// 搜索二叉树的右子树为空
else if (root->_right == nullptr)
{
root = root->_right;
}
// 左右子树都不为空
else
{
Node* leftMax = root->_left;
// 找替换值
while (leftMax->_right)
{
leftMax = leftMax->_right;
}
// 交换替换值
swap(root->_key, leftMax->_key);
return _erase(root->_left, key);
}
delete del;
return true;
}
}
// 搜索二叉树插入子函数
bool _insert(Node*& root, const K& key)
{
if (root == nullptr)
{
// 插入值
root = new Node(key);
return true;
}
if (root->_key < key)
{
return _insert(root->_right, key);
}
else if (root->_key > key)
{
return _insert(root->_left, key);
}
else
{
// 找到了相等的值,不能插入
return false;
}
}
// 搜索二叉树中序打印子函数
void _InOrder(Node* root)
{
if (root == nullptr) return;
// 先打印左子树
_InOrder(root->_left);
cout << root->_key << " ";
// 打印右子树
_InOrder(root->_right);
}
// 搜索二叉树查找子函数
bool _find(Node* root, const K& key)
{
// 空树
if (root == nullptr) return false;
// 要找的值大于当前结点的值
if (root->_key < key)
return _find(root->_right, key);
// 要找的值小于当前结点的值
else if (root->_key > key)
return _find(root->_left, key);
else
return true;
// 没有找到
return false;
}
Node* _root;
};
在这个特别的日子里,我有一个愿望:愿自己和大家在未来的编程道路上,再也不会遇到BUG。虽然这可能只是一个美好的愿望,但我相信,通过不断的学习和实践,我们可以减少BUG的出现,提高代码的质量和稳定性。
编程是一场既充满挑战又充满乐趣的旅程。在这个1024程序员节,让我们为自己选择这条道路而自豪。让我们继续学习,不断进步,用我们的代码创造一个更加美好的世界。