C++實(shí)現(xiàn)貪心算法(Greedy?Algorithm)的應(yīng)用場(chǎng)景示例
在計(jì)算機(jī)科學(xué)和數(shù)學(xué)優(yōu)化領(lǐng)域,算法的選擇往往決定了問(wèn)題解決的效率和質(zhì)量。作為一名后端開(kāi)發(fā)者,掌握各種算法及其適用場(chǎng)景是提升代碼質(zhì)量和性能的關(guān)鍵。貪心算法作為一種直觀且在特定問(wèn)題上高效的解決方案,在實(shí)際開(kāi)發(fā)中有著廣泛的應(yīng)用。
貪心算法的核心思想是"貪婪"地選擇當(dāng)前看起來(lái)最優(yōu)的解決方案,而不考慮全局。這種方法在某些問(wèn)題上能夠得到全局最優(yōu)解,但在另一些問(wèn)題上可能只能得到局部最優(yōu)解。理解貪心算法的工作原理、適用條件和局限性,對(duì)于我們正確選擇和應(yīng)用算法至關(guān)重要。
一、貪心算法的核心定義與本質(zhì)
貪心算法是一種在每一步選擇中都采取當(dāng)前狀態(tài)下最優(yōu)(即局部最優(yōu))的選擇,以期最終獲得全局最優(yōu)解的啟發(fā)式算法。其核心思想可概括為:“走一步看一步,每步都選最好的,不回頭”。
與動(dòng)態(tài)規(guī)劃(DP)需要存儲(chǔ)子問(wèn)題的最優(yōu)解并回溯不同,貪心算法不依賴(lài)歷史決策——它通過(guò)每一步的局部最優(yōu)積累,直接推導(dǎo)全局最優(yōu)。這種“短視”的特性使其實(shí)現(xiàn)簡(jiǎn)單、效率極高,但也決定了它并非適用于所有問(wèn)題,必須滿(mǎn)足嚴(yán)格的前提條件。
二、貪心算法的適用條件
判斷一個(gè)問(wèn)題能否用貪心算法解決,必須同時(shí)滿(mǎn)足以下兩個(gè)核心性質(zhì),缺一不可:
1. 貪心選擇性質(zhì)
每一步的局部最優(yōu)選擇,能夠?qū)蛉肿顑?yōu)解。即:在選擇當(dāng)前最優(yōu)解時(shí),不需要考慮后續(xù)的決策,其選擇結(jié)果不會(huì)影響后續(xù)子問(wèn)題的最優(yōu)性。
- 示例:活動(dòng)選擇問(wèn)題中,“選擇最早結(jié)束的活動(dòng)”這一局部最優(yōu)選擇,能為后續(xù)留下更多時(shí)間選擇其他活動(dòng),最終導(dǎo)向全局最優(yōu)(最多活動(dòng)數(shù))。
- 反例:0-1背包問(wèn)題中,“選擇價(jià)值密度最高的物品”無(wú)法保證全局最優(yōu)(可能因剩余空間無(wú)法容納其他高價(jià)值物品,導(dǎo)致總價(jià)值更低)。
2. 最優(yōu)子結(jié)構(gòu)性質(zhì)
全局最優(yōu)解中必然包含其子問(wèn)題的最優(yōu)解。即:?jiǎn)栴}的最優(yōu)解可以分解為若干個(gè)子問(wèn)題的最優(yōu)解的組合。
- 示例:Dijkstra算法中,“從源點(diǎn)到節(jié)點(diǎn)
v的最短路徑”必然包含“從源點(diǎn)到路徑上某中間節(jié)點(diǎn)u的最短路徑”——若存在更短的源點(diǎn)→u路徑,替換后可得到更短的源點(diǎn)→v路徑,與全局最優(yōu)矛盾。
3. 經(jīng)典反例:錯(cuò)誤的貪心策略
以“找零錢(qián)問(wèn)題”為例:
若硬幣面額為[1,3,4],需找6元。直覺(jué)貪心策略(選最大面額優(yōu)先)會(huì)得到4+1+1=6(3枚硬幣),但最優(yōu)解是3+3=6(2枚硬幣)。此時(shí)“最大面額優(yōu)先”的貪心策略不滿(mǎn)足“貪心選擇性質(zhì)”,導(dǎo)致全局最優(yōu)失效。
三、貪心算法的解題步驟
使用貪心算法解決問(wèn)題需遵循固定流程,核心是策略設(shè)計(jì)與正確性證明:
- 問(wèn)題建模:將實(shí)際問(wèn)題抽象為“選擇問(wèn)題”,明確目標(biāo)函數(shù)(如“最多活動(dòng)數(shù)”“最短路徑和”)和約束條件(如“活動(dòng)不沖突”“邊權(quán)非負(fù)”)。
- 設(shè)計(jì)貪心策略:確定每一步如何選擇“局部最優(yōu)”。常見(jiàn)策略包括:按結(jié)束時(shí)間排序、按價(jià)值密度排序、按邊權(quán)排序等。
- 證明策略正確性:通過(guò)數(shù)學(xué)歸納法或反證法,驗(yàn)證策略滿(mǎn)足“貪心選擇性質(zhì)”和“最優(yōu)子結(jié)構(gòu)”。
- 編碼實(shí)現(xiàn):根據(jù)策略選擇合適的數(shù)據(jù)結(jié)構(gòu)(如排序、優(yōu)先隊(duì)列、并查集),處理邊界情況(如空輸入、極端值)。
- 測(cè)試優(yōu)化:驗(yàn)證結(jié)果正確性,優(yōu)化時(shí)間復(fù)雜度(如用快排替代冒泡排序)。
四、經(jīng)典問(wèn)題與C++實(shí)現(xiàn)
貪心算法的應(yīng)用場(chǎng)景高度集中,以下為4類(lèi)核心問(wèn)題的詳細(xì)實(shí)現(xiàn):
1. 活動(dòng)選擇問(wèn)題(最多不沖突活動(dòng))
問(wèn)題描述
給定n個(gè)活動(dòng),每個(gè)活動(dòng)有開(kāi)始時(shí)間start[i]和結(jié)束時(shí)間end[i],選擇最多不重疊的活動(dòng)集合。
貪心策略
按活動(dòng)的結(jié)束時(shí)間升序排序,優(yōu)先選擇最早結(jié)束的活動(dòng)——該選擇能為后續(xù)活動(dòng)預(yù)留最多時(shí)間,最大化總活動(dòng)數(shù)。
C++實(shí)現(xiàn)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定義活動(dòng)結(jié)構(gòu)體
struct Activity {
int start; // 開(kāi)始時(shí)間
int end; // 結(jié)束時(shí)間
};
// 排序規(guī)則:按結(jié)束時(shí)間升序
bool compare(const Activity& a, const Activity& b) {
return a.end < b.end;
}
// 選擇最多不沖突活動(dòng)
vector<Activity> selectMaxActivities(vector<Activity>& activities) {
vector<Activity> result;
if (activities.empty()) return result;
// 1. 按結(jié)束時(shí)間排序
sort(activities.begin(), activities.end(), compare);
// 2. 選擇第一個(gè)活動(dòng)(最早結(jié)束)
result.push_back(activities[0]);
int lastEnd = activities[0].end;
// 3. 遍歷后續(xù)活動(dòng),選擇不沖突的(開(kāi)始時(shí)間>=上一個(gè)結(jié)束時(shí)間)
for (int i = 1; i < activities.size(); i++) {
if (activities[i].start >= lastEnd) {
result.push_back(activities[i]);
lastEnd = activities[i].end; // 更新最后一個(gè)活動(dòng)的結(jié)束時(shí)間
}
}
return result;
}
int main() {
vector<Activity> activities = {
{1, 4}, {3, 5}, {0, 6}, {5, 7}, {3, 9}, {5, 9}, {6, 10}, {8, 11}, {8, 12}, {2, 14}, {12, 16}
};
vector<Activity> selected = selectMaxActivities(activities);
// 輸出結(jié)果
cout << "選擇的活動(dòng)(開(kāi)始時(shí)間, 結(jié)束時(shí)間):" << endl;
for (auto& act : selected) {
cout << "(" << act.start << ", " << act.end << ")" << endl;
}
cout << "最多可選擇 " << selected.size() << " 個(gè)活動(dòng)" << endl;
return 0;
}
輸出結(jié)果
選擇的活動(dòng)(開(kāi)始時(shí)間, 結(jié)束時(shí)間): (1, 4) (5, 7) (8, 11) (12, 16) 最多可選擇 4 個(gè)活動(dòng)
2. 哈夫曼編碼(最優(yōu)前綴編碼)
問(wèn)題描述
給定字符的頻率分布(如a:5, b:9, c:12, d:13),構(gòu)造前綴編碼(無(wú)編碼是另一編碼的前綴),使總編碼長(zhǎng)度(頻率×編碼長(zhǎng)度之和)最小。
貪心策略
- 構(gòu)建最小堆(優(yōu)先隊(duì)列),存儲(chǔ)所有字符的頻率;
- 每次取出兩個(gè)頻率最小的節(jié)點(diǎn),合并為一個(gè)新節(jié)點(diǎn)(頻率為兩節(jié)點(diǎn)之和);
- 將新節(jié)點(diǎn)入堆,重復(fù)步驟2,直到堆中只剩一個(gè)節(jié)點(diǎn)(哈夫曼樹(shù)的根);
- 樹(shù)的左分支記為
0,右分支記為1,葉子節(jié)點(diǎn)的路徑即為對(duì)應(yīng)字符的編碼。
C++實(shí)現(xiàn)
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 計(jì)算哈夫曼編碼的總長(zhǎng)度
int huffmanCodeTotalLength(const vector<int>& frequencies) {
// 最小堆:priority_queue<Type, Container, Compare>
priority_queue<int, vector<int>, greater<int>> minHeap;
// 1. 將所有頻率入堆
for (int freq : frequencies) {
minHeap.push(freq);
}
int totalLength = 0; // 總編碼長(zhǎng)度
// 2. 合并節(jié)點(diǎn),直到堆中只剩1個(gè)節(jié)點(diǎn)
while (minHeap.size() > 1) {
// 取出兩個(gè)最小頻率
int first = minHeap.top();
minHeap.pop();
int second = minHeap.top();
minHeap.pop();
// 合并后的新節(jié)點(diǎn)頻率
int merged = first + second;
totalLength += merged; // 合并節(jié)點(diǎn)的頻率即編碼長(zhǎng)度貢獻(xiàn)
// 新節(jié)點(diǎn)入堆
minHeap.push(merged);
}
return totalLength;
}
int main() {
// 字符頻率:a:5, b:9, c:12, d:13, e:16, f:45
vector<int> frequencies = {5, 9, 12, 13, 16, 45};
int total = huffmanCodeTotalLength(frequencies);
cout << "哈夫曼編碼的總長(zhǎng)度:" << total << endl; // 輸出:224
return 0;
}
原理說(shuō)明
總長(zhǎng)度224的計(jì)算邏輯:
合并過(guò)程為5+9=14(貢獻(xiàn)14)→12+13=25(貢獻(xiàn)25)→14+16=30(貢獻(xiàn)30)→25+30=55(貢獻(xiàn)55)→45+55=100(貢獻(xiàn)100),總和14+25+30+55+100=224。
3. Dijkstra算法(單源最短路徑)
問(wèn)題描述
在帶非負(fù)權(quán)的無(wú)向/有向圖中,找到從源點(diǎn)S到所有其他節(jié)點(diǎn)的最短路徑長(zhǎng)度。
貪心策略
- 用
dist[]數(shù)組記錄源點(diǎn)到各節(jié)點(diǎn)的當(dāng)前最短距離(初始為INF,dist[S]=0); - 構(gòu)建最小堆,存儲(chǔ)(當(dāng)前最短距離,節(jié)點(diǎn)),初始將(0, S)入堆;
- 每次取出堆頂節(jié)點(diǎn)
u(當(dāng)前距離源點(diǎn)最近的未確定節(jié)點(diǎn)),標(biāo)記為“已確定”; - 遍歷
u的所有鄰接節(jié)點(diǎn)v,執(zhí)行松弛操作:若dist[v] > dist[u] + 邊權(quán)w,則更新dist[v],并將(dist[v], v)入堆; - 重復(fù)步驟3-4,直到堆為空。
C++實(shí)現(xiàn)
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <stdexcept> // 用于邊界校驗(yàn)異常
using namespace std;
const int INF = INT_MAX;
vector<int> dijkstra(int n, int source, const vector<vector<pair<int, int>>>& adj) {
// 邊界校驗(yàn):源點(diǎn)合法性
if (source < 0 || source >= n) {
throw invalid_argument("源點(diǎn)超出節(jié)點(diǎn)范圍!");
}
vector<int> dist(n, INF);
dist[source] = 0;
// 最小堆:(當(dāng)前距離, 節(jié)點(diǎn))
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minHeap;
minHeap.push({0, source});
while (!minHeap.empty()) {
auto [currentDist, u] = minHeap.top(); // C++17結(jié)構(gòu)化綁定
minHeap.pop();
if (currentDist > dist[u]) continue;
// 遍歷u的所有鄰接節(jié)點(diǎn)
for (auto [v, w] : adj[u]) {
// 松弛操作:更新dist[v]
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
minHeap.push({dist[v], v});
}
}
}
return dist;
}
int main() {
int n = 6; // 節(jié)點(diǎn)數(shù)(0~5)
vector<vector<pair<int, int>>> adj(n); // 局部鄰接表,替代全局變量
// 構(gòu)建圖(邊:u->v,權(quán)w)
adj[0].emplace_back(1, 2); // emplace_back比push_back更高效(直接構(gòu)造對(duì)象)
adj[0].emplace_back(2, 4);
adj[1].emplace_back(2, 1);
adj[1].emplace_back(3, 7);
adj[2].emplace_back(4, 3);
adj[3].emplace_back(5, 1);
adj[4].emplace_back(3, 2);
adj[4].emplace_back(5, 5);
int source = 0;
try {
vector<int> dist = dijkstra(n, source, adj);
// 輸出正確結(jié)果
cout << "源點(diǎn) " << source << " 到各節(jié)點(diǎn)的最短距離:" << endl;
for (int i = 0; i < n; ++i) {
if (dist[i] == INF) {
cout << "到節(jié)點(diǎn) " << i << ":不可達(dá)" << endl;
} else {
cout << "到節(jié)點(diǎn) " << i << ":" << dist[i] << endl;
}
}
} catch (const invalid_argument& e) {
// 捕獲邊界校驗(yàn)異常
cerr << "錯(cuò)誤:" << e.what() << endl;
return 1;
}
return 0;
}
輸出結(jié)果
源點(diǎn) 0 到各節(jié)點(diǎn)的最短距離: 到節(jié)點(diǎn) 0:0 到節(jié)點(diǎn) 1:2 到節(jié)點(diǎn) 2:3(0→1→2) 到節(jié)點(diǎn) 3:8(0→1→2→4→3) 到節(jié)點(diǎn) 4:6(0→1→2→4) 到節(jié)點(diǎn) 5:9(0→1→2→4→3→5)
4. Kruskal算法(最小生成樹(shù))
問(wèn)題描述
在無(wú)向帶權(quán)圖中,找到一棵連接所有節(jié)點(diǎn)、總邊權(quán)和最小的生成樹(shù)(Minimum Spanning Tree, MST)。
貪心策略
- 將所有邊按權(quán)值升序排序;
- 用并查集(Union-Find) 維護(hù)已選節(jié)點(diǎn)的連通性;
- 遍歷排序后的邊,若邊的兩個(gè)端點(diǎn)屬于不同連通分量(不構(gòu)成環(huán)),則將該邊加入MST,并合并兩個(gè)連通分量;
- 重復(fù)步驟3,直到MST包含
n-1條邊(n為節(jié)點(diǎn)數(shù))。
C++實(shí)現(xiàn)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定義邊結(jié)構(gòu)體
struct Edge {
int u; // 起點(diǎn)
int v; // 終點(diǎn)
int weight; // 邊權(quán)
};
// 并查集(Union-Find):維護(hù)連通分量
class UnionFind {
private:
vector<int> parent; // 父節(jié)點(diǎn)
vector<int> rank; // 秩(用于路徑壓縮優(yōu)化)
public:
UnionFind(int n) {
parent.resize(n);
rank.resize(n, 0);
for (int i = 0; i < n; i++) {
parent[i] = i; // 初始父節(jié)點(diǎn)為自身
}
}
// 查找根節(jié)點(diǎn)(路徑壓縮)
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]); // 遞歸壓縮路徑
}
return parent[x];
}
// 合并兩個(gè)連通分量(按秩合并)
bool unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) return false; // 已在同一分量
// 秩小的樹(shù)合并到秩大的樹(shù)
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
if (rank[rootX] == rank[rootY]) {
rank[rootX]++;
}
}
return true;
}
};
// Kruskal算法:返回MST的總邊權(quán)
int kruskal(int n, vector<Edge>& edges) {
// 1. 按邊權(quán)升序排序
sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) {
return a.weight < b.weight;
});
UnionFind uf(n);
int mstTotal = 0; // MST總邊權(quán)
int edgeCount = 0; // 已選邊數(shù)
// 2. 遍歷邊,選擇不構(gòu)成環(huán)的邊
for (auto& edge : edges) {
if (uf.unite(edge.u, edge.v)) {
mstTotal += edge.weight;
edgeCount++;
// MST需n-1條邊,提前退出
if (edgeCount == n - 1) break;
}
}
// 若邊數(shù)不足n-1,說(shuō)明圖不連通
return (edgeCount == n - 1) ? mstTotal : -1;
}
int main() {
int n = 5; // 節(jié)點(diǎn)數(shù)(0~4)
vector<Edge> edges = {
{0, 1, 2}, {0, 3, 6}, {1, 2, 3}, {1, 3, 8}, {1, 4, 5},
{2, 4, 7}, {3, 4, 9}
};
int mstTotal = kruskal(n, edges);
if (mstTotal == -1) {
cout << "圖不連通,無(wú)法構(gòu)建MST" << endl;
} else {
cout << "最小生成樹(shù)的總邊權(quán):" << mstTotal << endl; // 輸出:16
}
return 0;
}
原理說(shuō)明
MST的邊為(0,1,2)、(1,2,3)、(1,4,5)、(0,3,6),總權(quán)2+3+5+6=16,覆蓋所有5個(gè)節(jié)點(diǎn)且無(wú)環(huán)。
五、貪心算法與動(dòng)態(tài)規(guī)劃的對(duì)比
貪心與DP均依賴(lài)“最優(yōu)子結(jié)構(gòu)”,但核心差異在于子問(wèn)題的處理方式:
| 對(duì)比維度 | 貪心算法(Greedy) | 動(dòng)態(tài)規(guī)劃(DP) |
|---|---|---|
| 核心思想 | 局部最優(yōu)→全局最優(yōu),不回溯 | 存儲(chǔ)子問(wèn)題最優(yōu)解,回溯推導(dǎo)全局最優(yōu) |
| 子問(wèn)題處理 | 不存儲(chǔ)子問(wèn)題解,每步直接選最優(yōu) | 存儲(chǔ)子問(wèn)題解(如dp數(shù)組),避免重復(fù)計(jì)算 |
| 適用場(chǎng)景 | 滿(mǎn)足“貪心選擇性質(zhì)”的問(wèn)題 | 不滿(mǎn)足貪心選擇性質(zhì),但有最優(yōu)子結(jié)構(gòu) |
| 時(shí)間復(fù)雜度 | 低(通常O(nlogn),排序主導(dǎo)) | 較高(通常O(n²)或O(nm)) |
| 典型問(wèn)題 | 活動(dòng)選擇、哈夫曼編碼、Dijkstra | 0-1背包、最長(zhǎng)公共子序列、斐波那契 |
| 最優(yōu)解保證 | 需證明策略正確性,否則不保證 | 只要狀態(tài)轉(zhuǎn)移正確,必為全局最優(yōu) |
六、貪心算法的優(yōu)缺點(diǎn)與應(yīng)用場(chǎng)景
1. 優(yōu)點(diǎn)
- 實(shí)現(xiàn)簡(jiǎn)單:無(wú)需復(fù)雜的狀態(tài)轉(zhuǎn)移或子問(wèn)題存儲(chǔ),代碼邏輯清晰;
- 效率極高:時(shí)間復(fù)雜度多為
O(nlogn)(排序)或O(MlogN)(優(yōu)先隊(duì)列),遠(yuǎn)低于DP; - 空間緊湊:無(wú)需存儲(chǔ)子問(wèn)題解,空間復(fù)雜度通常為
O(n)。
2. 缺點(diǎn)
- 適用范圍窄:僅能解決滿(mǎn)足“貪心選擇性質(zhì)”的問(wèn)題,多數(shù)問(wèn)題不適用;
- 正確性難證:需嚴(yán)格證明策略的有效性,直覺(jué)性策略易出錯(cuò)(如找零錢(qián)反例);
- 無(wú)回溯機(jī)制:一旦選擇錯(cuò)誤,無(wú)法修正,只能重新設(shè)計(jì)策略。
3. 實(shí)際應(yīng)用
- 資源調(diào)度:CPU短作業(yè)優(yōu)先(SJF)調(diào)度、任務(wù)優(yōu)先級(jí)調(diào)度;
- 編碼壓縮:哈夫曼編碼(用于ZIP、JPEG等格式);
- 路徑規(guī)劃:Dijkstra算法(導(dǎo)航軟件核心算法之一);
- 網(wǎng)絡(luò)優(yōu)化:Kruskal/Prim算法(構(gòu)建通信網(wǎng)絡(luò)最小成本拓?fù)洌?/li>
貪心算法是一種“高效但挑剔”的算法:它通過(guò)局部最優(yōu)的積累快速推導(dǎo)全局最優(yōu),但僅適用于滿(mǎn)足“貪心選擇性質(zhì)”和“最優(yōu)子結(jié)構(gòu)”的問(wèn)題。掌握貪心算法的核心在于:
- 學(xué)會(huì)判斷問(wèn)題是否符合貪心適用條件;
- 設(shè)計(jì)正確的貪心策略并證明其有效性;
- 熟練運(yùn)用排序、優(yōu)先隊(duì)列、并查集等數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)策略。
七、總結(jié)
到此這篇關(guān)于C++實(shí)現(xiàn)貪心算法(Greedy Algorithm)的應(yīng)用場(chǎng)景示例的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)貪心算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++算法學(xué)習(xí)之貪心算法的應(yīng)用
- C++ 算法精講之貪心算法
- C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán)
- C++貪心算法實(shí)現(xiàn)活動(dòng)安排問(wèn)題(實(shí)例代碼)
- C語(yǔ)言基于貪心算法解決裝箱問(wèn)題的方法
- C++ 搬水果貪心算法實(shí)現(xiàn)代碼
- 貪心算法的C語(yǔ)言實(shí)現(xiàn)與運(yùn)用詳解
- c語(yǔ)言來(lái)實(shí)現(xiàn)貪心算法之裝箱問(wèn)題
- 采用C++實(shí)現(xiàn)區(qū)間圖著色問(wèn)題(貪心算法)實(shí)例詳解
- 貪心算法 WOODEN STICKS 實(shí)例代碼
相關(guān)文章
C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類(lèi)的實(shí)例代碼
這篇文章主要介紹了C++ 實(shí)現(xiàn)一個(gè)復(fù)數(shù)類(lèi)的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
VSCode保存代碼自動(dòng)格式化無(wú)效的解決方法
最近一直使用vscode,VSCode中各種配置后,自動(dòng)保存格式化仍然無(wú)效,本文就來(lái)介紹一下解決方法,感興趣的可以了解一下2023-08-08
C語(yǔ)言中的while循環(huán)語(yǔ)句示例詳解
這篇文章主要介紹了C語(yǔ)言中的while循環(huán)語(yǔ)句,主要包括while循環(huán)的基本信息及常見(jiàn)問(wèn)題,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06
c++中new一個(gè)結(jié)構(gòu)體初始化過(guò)程
這篇文章主要介紹了c++中new一個(gè)結(jié)構(gòu)體初始化過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
C++報(bào)錯(cuò)`Null Pointer Dereference`的解決方法
在軟件開(kāi)發(fā)中,Null Pointer Dereference 是一種常見(jiàn)的錯(cuò)誤,它發(fā)生在程序試圖訪問(wèn)或操作一個(gè)空指針指向的內(nèi)存位置時(shí),這種情況通常會(huì)導(dǎo)致程序崩潰,給 debug 工作帶來(lái)很大困擾,今天,我們將探討如何解決 Null Pointer Dereference 報(bào)錯(cuò),需要的朋友可以參考下2024-07-07

