获课♥》789it.top/14147/
C++与数据结构:构建高性能应用程序的基础
C++作为高性能编程语言的优势
C++因其独特的特性成为构建高性能应用程序的首选语言:
-
零成本抽象:高级特性如类、模板几乎不带来运行时开销
-
内存控制:直接内存访问和精细的内存管理能力
-
多范式支持:支持面向对象、泛型和过程式编程
-
硬件访问:内联汇编和与C的兼容性允许底层硬件操作
-
标准库丰富:提供STL等高效的数据结构和算法实现
基础数据结构及其C++实现
数组与向量
cpp
复制
下载
// 原始数组
int arr[5] = {1, 2, 3, 4, 5};
// std::array (C++11)
std::array<int, 5> stdArr = {1, 2, 3, 4, 5};
// std::vector (动态数组)
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // 动态扩展
链表结构
cpp
复制
下载
// 单向链表节点
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// std::forward_list (C++11单向链表)
std::forward_list<int> flist = {1, 2, 3};
// std::list (双向链表)
std::list<int> dlist = {4, 5, 6};
dlist.push_front(3);
dlist.push_back(7);
栈与队列
cpp
复制
下载
// 栈 std::stack<int> s; s.push(1); s.push(2); int top = s.top(); // 2 s.pop(); // 队列 std::queue<int> q; q.push(1); q.push(2); int front = q.front(); // 1 q.pop(); // 优先队列(堆) std::priority_queue<int> pq; pq.push(3); pq.push(1); pq.push(4); int top = pq.top(); // 4
哈希表
cpp
复制
下载
// std::unordered_map (哈希表) std::unordered_map<std::string, int> wordCount; wordCount["hello"] = 1; wordCount["world"] = 2; // std::unordered_set (哈希集合) std::unordered_set<int> uniqueNumbers; uniqueNumbers.insert(1); uniqueNumbers.insert(2);
高级数据结构实现
二叉搜索树
cpp
复制
下载
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class BST {
private:
TreeNode* root;
TreeNode* insert(TreeNode* node, int val) {
if (!node) return new TreeNode(val);
if (val < node->val) node->left = insert(node->left, val);
else node->right = insert(node->right, val);
return node;
}
public:
BST() : root(nullptr) {}
void insert(int val) {
root = insert(root, val);
}
// 其他操作...
};
图结构
cpp
复制
下载
// 邻接表表示
class Graph {
private:
int V; // 顶点数
std::vector<std::list<int>> adj;
public:
Graph(int V) : V(V), adj(V) {}
void addEdge(int v, int w) {
adj[v].push_back(w);
}
void BFS(int s) {
std::vector<bool> visited(V, false);
std::queue<int> q;
visited[s] = true;
q.push(s);
while (!q.empty()) {
s = q.front();
q.pop();
for (auto i = adj[s].begin(); i != adj[s].end(); ++i) {
if (!visited[*i]) {
visited[*i] = true;
q.push(*i);
}
}
}
}
};
性能优化技巧
-
内存局部性优化:
-
使用连续内存结构(如vector)替代链表
-
预分配内存避免频繁重新分配
-
-
算法选择:
-
根据数据规模选择O(1)、O(log n)或O(n)算法
-
权衡时间与空间复杂度
-
-
缓存友好设计:
-
结构体大小对齐
-
避免随机内存访问模式
-
-
移动语义(C++11):
cpp
复制
下载
std::vector<int> createLargeVector() { std::vector<int> v(1000000); // 填充数据... return v; // 使用移动而非复制 } -
智能指针管理内存:
cpp
复制
下载
std::shared_ptr<Node> node = std::make_shared<Node>(42); std::unique_ptr<Node> uniqueNode = std::make_unique<Node>(24);
实际应用案例
高性能缓存实现
cpp
复制
下载
template<typename K, typename V>
class LRUCache {
private:
using ListType = std::list<std::pair<K, V>>;
using MapType = std::unordered_map<K, typename ListType::iterator>;
ListType cacheList;
MapType cacheMap;
size_t capacity;
public:
LRUCache(size_t capacity) : capacity(capacity) {}
V get(K key) {
auto it = cacheMap.find(key);
if (it == cacheMap.end()) return V();
// 移动到列表前端
cacheList.splice(cacheList.begin(), cacheList, it->second);
return it->second->second;
}
void put(K key, V value) {
auto it = cacheMap.find(key);
if (it != cacheMap.end()) {
it->second->second = value;
cacheList.splice(cacheList.begin(), cacheList, it->second);
return;
}
if (cacheMap.size() >= capacity) {
// 移除最久未使用的
K lastKey = cacheList.back().first;
cacheMap.erase(lastKey);
cacheList.pop_back();
}
cacheList.emplace_front(key, value);
cacheMap[key] = cacheList.begin();
}
};
并发数据结构
cpp
复制
下载
#include <mutex>
#include <condition_variable>
template<typename T>
class ThreadSafeQueue {
private:
std::queue<T> queue;
mutable std::mutex mtx;
std::condition_variable cv;
public:
void push(T value) {
std::lock_guard<std::mutex> lock(mtx);
queue.push(std::move(value));
cv.notify_one();
}
bool try_pop(T& value) {
std::lock_guard<std::mutex> lock(mtx);
if (queue.empty()) return false;
value = std::move(queue.front());
queue.pop();
return true;
}
void wait_and_pop(T& value) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this]{ return !queue.empty(); });
value = std::move(queue.front());
queue.pop();
}
};
现代C++特性应用
使用模板元编程优化
cpp
复制
下载
template<typename T, size_t BlockSize = 4096 / sizeof(T)>
class MemoryPool {
private:
struct Block {
T data[BlockSize];
Block* next;
};
Block* currentBlock = nullptr;
size_t currentPosition = 0;
public:
T* allocate() {
if (!currentBlock || currentPosition >= BlockSize) {
currentBlock = new Block{ {}, currentBlock };
currentPosition = 0;
}
return ¤tBlock->data[currentPosition++];
}
~MemoryPool() {
while (currentBlock) {
Block* next = currentBlock->next;
delete currentBlock;
currentBlock = next;
}
}
};
使用Lambda和算法
cpp
复制
下载
void processData(std::vector<int>& data) {
// 并行排序 (C++17)
std::sort(std::execution::par, data.begin(), data.end());
// 使用lambda过滤
data.erase(std::remove_if(data.begin(), data.end(),
[](int x) { return x % 2 == 0; }), data.end());
// 变换操作
std::transform(data.begin(), data.end(), data.begin(),
[](int x) { return x * x; });
}
总结
C++与数据结构的结合为构建高性能应用程序提供了坚实基础。通过:
-
深入理解各种数据结构的特性和适用场景
-
掌握C++内存管理和性能优化技巧
-
合理利用现代C++特性简化代码并提升效率
-
针对具体问题选择或设计最合适的数据结构
开发者可以构建出既高效又可维护的系统级应用程序。持续学习和实践是掌握这一强大组合的关键。
