C++字符串詳解:原理、操作及力扣算法實戰

一、C++字符串簡介

在C++中,字符串的處理方式主要有兩種:字符數組(C風格字符串)和std::string類。雖然字符數組是C語言遺留的底層實現方式,但現代C++更推薦使用std::string類,其封裝了復雜的操作邏輯,提供了更高的安全性和便利性。本文將深入解析C++字符串的原理、常用操作,并結合力扣算法題進行實戰演練。


二、C++字符串的原理

1. 字符數組(C風格字符串)

  • 原理:字符數組是以\0結尾的字符序列,通過手動管理內存實現字符串操作。
  • 特點
    • 需預分配固定大小,容易溢出。
    • 操作依賴標準庫函數(如strcpystrlen等),需手動處理邊界問題。
    • 適合對內存控制要求極高的底層場景。
char str[10] = "hello"; // 存儲"hello\0"

2. std::string類

  • 原理std::string是C++標準庫提供的動態字符串類,內部通過動態內存管理實現自動擴容和縮容。
  • 特點
    • 自動管理內存,無需手動分配/釋放。
    • 提供豐富的成員函數(如拼接、查找、替換等)。
    • 支持STL容器和算法,兼容性高。
    • 通過移動語義(C++11)優化臨時對象的資源轉移效率。
#include <string>
std::string s = "hello";
s += " world"; // 自動擴容

三、C++字符串的常用操作

1. 賦值與初始化

std::string s1 = "hello";       // 直接賦值
std::string s2(5, 'a');          // 構造5個'a'組成的字符串
std::string s3(s1);              // 拷貝構造
std::string s4 = s1 + s2;        // 拼接賦值

2. 字符串拼接

std::string s = "Hello";
s += " C++";                     // 運算符重載
s.append(" world");              // 成員函數

3. 查找與替換

std::string s = "Hello World";
size_t pos = s.find("World");    // 查找子串位置
if (pos != std::string::npos) {s.replace(pos, 5, "C++");     // 替換為"C++"
}

4. 子串提取

std::string s = "Hello C++";
std::string sub = s.substr(6, 4); // 提取從索引6開始的4個字符:"C++"

5. 字符串比較

std::string a = "apple", b = "banana";
if (a < b) {                     // 字典序比較std::cout << "a is smaller";
}

6. 長度與空判斷

std::string s = "hello";
std::cout << s.size();           // 輸出長度(5)
std::cout << s.empty();          // 判斷是否為空(0)

7. 邊界安全訪問

std::string s = "example";
char ch1 = s[2];                 // 不檢查邊界
char ch2 = s.at(2);              // 檢查邊界,越界拋出異常

四、力扣算法實戰:字符串應用場景

1.?回文串驗證(LeetCode 125)

題目:驗證字符串是否為回文串(忽略非字母數字字符,不區分大小寫)。

思路:雙指針法,從兩端向中心遍歷,逐字符比較。

#include <string>
#include <cctype>
using namespace std;bool isPalindrome(string s) {int left = 0, right = s.size() - 1;while (left < right) {while (left < right && !isalnum(s[left])) left++;while (left < right && !isalnum(s[right])) right--;if (tolower(s[left]) != tolower(s[right])) return false;left++, right--;}return true;
}

2.?最長公共前綴(LeetCode 14)

題目:找出多個字符串的最長公共前綴。

思路:縱向掃描,逐字符比較所有字符串的相同位置。

#include <string>
#include <vector>
using namespace std;string longestCommonPrefix(vector<string>& strs) {if (strs.empty()) return "";for (int i = 0; i < strs[0].size(); ++i) {char c = strs[0][i];for (int j = 1; j < strs.size(); ++j) {if (i == strs[j].size() || strs[j][i] != c) {return strs[0].substr(0, i);}}}return strs[0];
}

3.?字符串轉換整數(atoi)(LeetCode 8)

題目:將字符串轉換為整數,處理空格、符號和溢出。

思路:狀態機處理輸入,逐字符解析。

#include <string>
#include <climits>
using namespace std;int myAtoi(string s) {int index = 0, sign = 1, result = 0;while (s[index] == ' ') index++;if (s[index] == '-' || s[index] == '+') {sign = (s[index++] == '-') ? -1 : 1;}while (index < s.size() && isdigit(s[index])) {int digit = s[index++] - '0';if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > INT_MAX % 10)) {return (sign == 1) ? INT_MAX : INT_MIN;}result = result * 10 + digit;}return sign * result;
}

五、知識點總結

1.?std::string vs 字符數組

特性std::string字符數組(char[]
內存管理自動擴容/縮容靜態分配,需手動管理
操作便捷性成員函數豐富(如findsubstr等)依賴標準庫函數(如strcpy等)
安全性邊界檢查(at())、異常處理容易溢出,需手動添加\0
性能高(現代編譯器優化)更低(頻繁內存拷貝)
推薦使用場景通用開發、STL兼容嵌入式系統、協議解析等底層場景

2.?設計建議

  • 優先使用std::string:現代C++開發中,std::string是首選方式,其封裝了復雜邏輯,減少內存泄漏風險。
  • 避免字符數組:除非對性能或內存布局有嚴格要求,否則不建議使用字符數組。
  • 利用移動語義(C++11):臨時對象的資源轉移通過std::move優化效率。
  • 邊界檢查:使用at()代替[]避免越界訪問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88571.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CMU15445-2024fall-project1踩坑經歷

p1目錄&#xff1a;lRU\_K替換策略LRULRU\_K大體思路SetEvictableRecordAccessSizeEvictRemoveDisk SchedulerBufferPoolNewPageDeletePageFlashPage/FlashAllPageCheckReadPage/CheckWritePagePageGuard并發設計主邏輯感謝CMU的教授們給我們分享了如此精彩的一門課程&#xff…

【C語言進階】帶你由淺入深了解指針【第四期】:數組指針的應用、介紹函數指針

前言上一期講了數組指針的原理&#xff0c;這一期接著上一期講述數組指針的應用以及數組參數、函數參數。首先看下面的代碼進行上一期內容的復習&#xff0c;pc應該是什么類型&#xff1f;char* arr[5] {0}; xxx pc &arr;分析&#xff1a;①首先判斷arr是一個數組&#x…

在HTML中CSS三種使用方式

一、行內樣式在標簽<>中輸入style "屬性&#xff1a;屬性值;"。(中等使用頻率)不利于CSS樣式的復用&#xff1b;違背了CSS內容和樣式分離的設計理念&#xff0c;后期難以維護。<p style"color: red">這是div中的p元素</p>二、內部樣式在…

汽車功能安全-軟件單元驗證 (Software Unit Verification)【用例導出方法、輸出物】8

文章目錄1 軟件單元驗證用例導出方法2 測試用例完整性度量標準3 驗證環境要求4 軟件單元驗證的工作產品1 軟件單元驗證用例導出方法 為確保軟件單元測試的測試案例規范符合9.4.2要求&#xff0c;應通過表8所列方法開發測試用例。 表8 軟件單元測試用例的得出方法&#xff1a; …

MySQL內置函數(8)

文章目錄前言一、日期函數二、字符串函數三、數學函數四、其它函數總結前言 其實在之前的幾篇中我們也用到了內置函數&#xff0c;現在我們再來系統學習一下它&#xff01; 一、日期函數 函數名稱描述current_date()獲取當前日期current_time()獲取當前時間current_timestamp(…

蒼穹外賣項目日記(day04)

蒼穹外賣|項目日記(day04) 前言: 今天主要是接口開發, 涉及的新東西不多, 需要注意的只有多表聯查和修改的邏輯,今日難點: 1.菜品的停起售狀態設置 2.套餐的停起售狀態設置 3.動態sql中的 useGeneratedKeys 與 keyProperty 兩個參數 一. 菜品的停起售狀態設置 ? 在菜品的停售中…

React之旅-05 List Key

每個React的初學者&#xff0c;在調試程序時&#xff0c;都會遇到這樣的警告&#xff1a;Warning: Each child in a list should have a unique "key" prop. 如下面的代碼&#xff1a; const list [Learn React, Learn GraphQL];const ListWithoutKey () > (&l…

[特殊字符] 人工智能技術全景:從基礎理論到前沿應用的深度解析

&#x1f680; 人工智能技術全景&#xff1a;從基礎理論到前沿應用的深度解析 在這個AI驅動的時代&#xff0c;理解人工智能的核心技術和應用場景已成為技術人員的必備技能。本文將帶你深入探索AI的發展脈絡、核心技術差異以及在各行業的創新應用。 文章目錄&#x1f680; 人工…

Go語言教程-環境搭建

前言 Go&#xff08;又稱 Golang&#xff09;是由 Google 開發的一種 開源、靜態類型、編譯型 編程語言&#xff0c;于 2009 年正式發布。它旨在解決現代軟件開發中的高并發、高性能和可維護性問題&#xff0c;尤其適合 云計算、微服務、分布式系統 等領域。 Go 語言國際官網…

windows指定某node及npm版本下載

下載并安裝 nvm-windowshttps://github.com/coreybutler/nvm-windows/releases&#xff08;選擇 nvm-setup.zip&#xff09;。打開命令提示符&#xff08;管理員權限&#xff09;&#xff0c;安裝 Node.js v16.15.0&#xff1a; nvm install 16.15.0 nvm use 16.15.0 驗證node版…

每天一個前端小知識 Day 28 - Web Workers / 多線程模型在前端中的應用實踐

Web Workers / 多線程模型在前端中的應用實踐&#x1f9e0; 一、為什么前端需要多線程&#xff1f; 單線程 JS 的瓶頸&#xff1a;瀏覽器主線程不僅負責執行 JS&#xff0c;還要負責&#xff1a; UI 渲染&#xff08;DOM/CSS&#xff09;用戶事件處理&#xff08;點擊、輸入&am…

python:ImportError: cannot import name ‘ParameterSource‘ from ‘click.core‘

瀏覽器訪問網站拋錯&#xff1a;ImportError: cannot import name ParameterSource from click.core (E:\environment\python\Lib\site-packages\click\core.py)問題分析&#xff1a;1. click 版本問題ParameterSource 可能是在某個特定版本的 click 庫中引入的&#xff0c;而你…

flink 去重

LOCALTIMESTAMP as time_stamp ts as case when time is null then CURRENT_TIMESTAMP else TO_TIMESTAMP_LTZ(time, 0) end , watermark for ts as ts - interval ‘60’ second PARTITION BY 的都有回撤流 group by 的沒有回撤流 因為算的是指標 開窗又慢 SELECT * FROM (…

【音視頻】TS協議解析

參考博客&#xff1a;https://blog.csdn.net/rell336/article/details/38109621?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMac…

uniapp 日期組件可選擇年月

month-picker 月份選擇器組件 組件介紹 month-picker 是一個用于選擇年月的自定義組件&#xff0c;基于 uni-app 開發&#xff0c;提供了簡潔的月份選擇功能。 解決彈框底部出現底部頁面區域 safe-area屬性設為true時&#xff0c;即可解決這個問題效果如圖功能特點 支持選擇年份…

從真人到數字分身:3D人臉掃描設備在高校數字人建模教學中的應用

在影視、動漫、游戲等數字創意產業蓬勃發展的當下&#xff0c;超寫實虛擬數字人憑借其高度逼真的形象&#xff0c;成為行業關注的焦點。無論是影視特效中栩栩如生的角色&#xff0c;還是游戲里精致的NPC&#xff0c;超寫實虛擬數字人的制作都離不開先進的技術支撐。而3D人臉掃描…

你以為大數據只是存?其實真正的“寶藏”藏在這招里——數據挖掘!

你以為大數據只是存&#xff1f;其實真正的“寶藏”藏在這招里——數據挖掘&#xff01; 曾經我也天真地以為&#xff0c;搞大數據就是會寫幾個SQL、部署個Hadoop集群&#xff0c;結果真到項目現場&#xff0c;甲方爸爸一句&#xff1a;“給我挖掘一下用戶的購買意圖”&#xf…

LeetCode經典題解:128、最長連續序列

“最長連續序列”是一道極具代表性的數組處理問題&#xff0c; 本文將帶你從直觀思路出發&#xff0c;逐步推導出最優解法&#xff0c;并通過場景化記憶技巧掌握核心邏輯。 一、題目描述 題目&#xff1a;給定一個未排序的整數數組 nums&#xff0c;找出數字連續的最長序列&…

電力分析儀的“雙語對話”:CCLinkIE與Modbus TCP的無縫連接

在工業自動化領域&#xff0c;協議兼容性問題如同“方言壁壘”&#xff0c;讓不同品牌、不同系統的設備難以高效協同。對于電力分析儀這類關鍵設備而言&#xff0c;如何打破CCLinkIE與Modbus TCP協議的“語言障礙”&#xff0c;已成為工程師優化系統集成的核心課題。 為何需要協…

暑假復習篇之文本編譯器

一、知識點補充【在此次示例代碼上顯示的關鍵用法】知識點1、JMenuBar&#xff1a;菜單欄的容器&#xff0c;通常添加到JFrame的頂部。關鍵用法&#xff1a;add&#xff1a; 添加菜單到菜單欄2、JMenu&#xff1a;菜單條目&#xff08;“文件” “編輯” 等&#xff09;&#x…