C++: STL簡介與string類核心技術解析及其模擬實現

目錄:

      • 一.STL
      • 二.string類
        • 一、創建對象的6種構造方式
        • 二、常用接口解析
          • 1. 容量操作
          • 2. 元素訪問
          • 3. 修改操作
          • 4. 字符串操作
      • 三.string模擬實現
        • 一、設計基礎:類結構與資源管理
        • 二、拷貝控制:深拷貝的三種實現
          • 1. 傳統深拷貝
          • 2. 現代寫法(推薦)
        • 三、關鍵功能實現
          • 1. 容量管理
          • 2. 訪問操作
          • 3. 數據修改操作
          • 4. 字符串操作
        • 四、運算符重載與IO
          • 1. 關系運算符
          • 2. 流操作符
      • 四.總結

一.STL

STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架。
1. STL核心架構
STL(標準模板庫)由三大核心組件構成:

  • 容器(數據結構):存儲數據的模板類(如vector/list/map)
  • 算法:通用算法(如sort/find),可適配不同容器
  • 迭代器:連接容器與算法的橋梁,支持統一遍歷方式

2. 重要版本對比

  • SGI版:GCC采用,可讀性最佳,適合源碼學習
  • P.J.版:VS采用,閉源但性能優異
  • HP原始版:所有版本始祖,開源自由(沒錯就是你知道的那個的惠普)

3. 六大組件應用
在這里插入圖片描述

在這里推薦一本書: 侯捷老師的《STL源碼剖析》,里面系統的講解STL的源碼


二.string類

一、創建對象的6種構造方式
構造方式語法示例功能描述
默認構造std::string s1;創建空字符串(長度為0)
拷貝構造std::string s2(s1);復制另一個字符串的內容
C字符串構造std::string s3("Hello");用C風格字符串初始化(需以\0結尾)
子串構造std::string s4(s3, 1, 3);s3的第1個字符開始取3個字符("ell"
部分構造std::string s5("Hello", 4);取C字符串的前4個字符("Hell"
填充構造std::string s6(5, 'A');生成5個重復字符("AAAAA"

? 注意

  • 子串構造中 s4(s3, pos, len)
    pos超出范圍會拋out_of_range異常,len超長時自動截斷。
  • 所有構造支持鏈式操作:
    std::string s = std::string("Hi") + " there!";
    在這里插入圖片描述

二、常用接口解析
1. 容量操作
接口參數返回值功能示例
resize(len)len:新長度void調整字符串長度(默認用\0填充)s.resize(3); // "Hel"
resize(len, c)c:填充字符void指定填充字符擴展/縮短s.resize(5, '!'); // "Hello!!"
reserve(size)size:預留容量void預分配內存避免多次擴容s.reserve(100);
size()size_t返回字符串的有效長度s.size();
capacity()size_t返回空間總大小`s.capacity();

? 性能提示

  • reserve()減少動態分配次數,適合已知大小時提前調用,當reserve的參數小于string的底層空間總大小時,reserver不會改變容量大小。
  • resize()擴展時未指定字符則填充空字符(\0),如果resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變`。
    在這里插入圖片描述
    注意在vs底下reserve會可能多開一些空間,而Linux下你要多少它開多少

2. 元素訪問
接口參數返回值行為說明
operator[](i)i:索引位置char&不檢查越界(訪問越界=未定義行為)
at(i) (不常用)i:索引位置char&檢查越界(越界拋out_of_range異常)

有了operator;我們就可以像數組一樣訪問遍歷或修改數據了
在這里插入圖片描述

范圍for

  • for循環后的括號由冒號“ :”分為兩部分:第一部分是范圍內用于迭代的變量,第二部分則表示被迭代的范圍,自動迭代,自動取數據,自動判斷結束。
  • 范圍for可以作用到數組和容器對象上進行遍歷
  • 范圍for的底層很簡單,容器遍歷實際就是替換為迭代器,這個從匯編層也可以看到。
	//范圍for 底層是迭代器,只能正序遍歷for (auto e : str2)//值拷貝{cout << e << " ";}cout << endl;for (auto& e : str2)//引用會修改原字符串{e++;cout << e << " ";}

在這里插入圖片描述

auto關鍵字
作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期
推導而得
用auto聲明指針類型時,用auto和auto*沒有任何區別,但用auto聲明引用類型時則必須加&
當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際
只對第一個類型進行推導,然后用推導出來的類型定義其他變量。
auto不能作為函數的參數,可以做返回值,但是建議謹慎使用
auto不能直接用來聲明數組
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
typeid().name()可以查看數據的類型

迭代器
迭代器(Iterator)是C++ STL中至關重要的抽象機制,其意義遠超出簡單的遍歷容器元素。

  • 迭代器為不同類型容器(如vector、list、map)提供了統一的元素訪問方式,隱藏了底層存儲結構的差異。
//迭代器
void func(const string& str)
{string::const_iterator it = str.begin();//從前向后打印,不可修改值while (it != str.end()){cout << *it << " ";++it;}cout << endl;//string::const_reverse_iterator itr = str.rbegin();//從后向前打印,且不可修改值auto itr = str.rbegin();while (itr != str.rend()){cout << *itr << " ";++itr;}}
int main()
{
string str1;
string str2("hello world");cout << endl;
string::iterator it = str2.begin();
while (it != str2.end())
{cout << *it << " ";++it;
}cout << endl;
it = str2.begin();
while (it != str2.end())
{(*it)-- ;cout << (*it) << " ";++it;
}cout << endl;
string::reverse_iterator it1 = str2.rbegin();
while (it1 != str2.rend())
{cout << *it1 << " ";++it1;
}cout << endl;
func(str2);
}

暫且先記住是這樣的,以后會講,而且string類不喜歡使用迭代器
it 可能是指針也可能不是
begin+ end: begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器
在這里插入圖片描述
rbegin + rend :begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器
在這里插入圖片描述


3. 修改操作
接口參數返回值功能
append(str)str:追加的字符串string&尾部添加字符串
push_back(c)c:單個字符void尾部添加字符(等價于+=
insert(pos, str)pos:插入位置,str:內容string&pos處插入字符串
erase(pos, len)pos:起始位置,len:長度string&刪除子串(默認刪到結尾)
operator+=(str)str:追加內容string&追加字符串或字符(最常用)
clear()void清空內容(長度=0,容量不變)

示例

std::string s = "Hello";
s.append(" World");  // "Hello World"
s.insert(5, " C++"); // "Hello C++ World"
s.erase(5, 4);       // "Hello World"
s += '!';            // "Hello World!"

避免循環中反復調用str += ch,改用reserve() + 循環更高效
頻繁拼接字符串時,優先用+=append()而非+(減少臨時對象)。


4. 字符串操作
接口參數返回值功能
find(str, pos)str:查找內容,pos:起始位置size_t返回首次出現的位置(未找到返回npos
substr(pos, len)pos:起始位置,len:長度string提取子串(默認到結尾)
c_str()const char*返回C風格字符串(只讀)

c_str()返回的指針在字符串修改后可能失效,需立即使用。
查詢操作(如find)時間復雜度為O(n),避免在大循環中調用。

示例

std::string s = "Hello World";
size_t pos = s.find("World");  // pos = 6
std::string sub = s.substr(6, 5); // "World"
const char* cstr = s.c_str();    // 用于C接口函數

場景:從路徑中提取文件名(不含擴展名)

#include <iostream>
#include <string>int main() {std::string path = "/home/user/file.txt";// 1. 從末尾找到最后一個'.'size_t dot_pos = path.rfind('.');// 2. 從開頭到'.'之前截取std::filename = path.substr(0, dot_pos);// 3. 從末尾找到最后一個'/'size_t slash_pos = path.rfind('/');// 4. 從'/'后截取到'.'前std::string name = path.substr(slash_pos + 1, dot_pos - slash_pos - 1);std::cout << name; // 輸出 "file"
}

完整接口列表見C++ Reference(非官方)。


三.string模擬實現

一、設計基礎:類結構與資源管理

核心成員變量

class string {
private:size_t _size;      // 當前字符串長度size_t _capacity;  // 當前內存容量char* _str;       // 動態內存指針
};

構造與析構關鍵點

// 默認構造(支持空字符串)
string(const char* str = "") {_size = strlen(str);//計算字符串的大小_capacity = _size;_str = new char[_capacity + 1];  // +1存儲'\0'memcpy(_str, str, _size + 1);    // 高效內存拷貝
}// 析構函數
~string() {delete[] _str;  // 釋放動態內存_str = nullptr;_size = _capacity = 0;
}

設計陷阱:若使用編譯器生成的默認拷貝構造,會導致淺拷貝問題——多個對象共享同一內存,析構時重復釋放。這也是為什么必須手動實現深拷貝。
在這里插入圖片描述

二、拷貝控制:深拷貝的三種實現
1. 傳統深拷貝
// 拷貝構造
string(const string& str) {_str = new char[str._capacity + 1];memcpy(_str, str._str, str._size + 1);_size = str._size;_capacity = str._capacity;
}// 賦值重載
string& operator=(const string& s) {if(this != &s) {  // 防止自賦值char* tmp = new char[s._capacity + 1];memcpy(tmp, s._str, s._size + 1);delete[] _str;  // 釋放舊內存_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;
}
2. 現代寫法(推薦)
void swap(string& tmp) {std::swap(_str, tmp._str);std::swap(_size, tmp._size);std::swap(_capacity, tmp._capacity);
}// 拷貝構造
string(const string& str): _str(nullptr) {string tmp(str._str); // 調用構造函數string(const char* str),創建一個內容與str完全相同的臨時對象tmpswap(tmp);  //調用成員函數swap()交換當前對象和臨時對象的內容     //交換后,當前對象獲得tmp的資源(即拷貝的數據)//tmp獲得當前對象初始時的空狀態(nullptr)    //當函數結束時,臨時對象tmp離開作用域//調用tmp的析構函數,釋放其持有的資源(此時是nullptr,安全釋放)
}// 賦值重載
string& operator=(string tmp) 
{ // 傳值產生臨時副本swap(tmp);  // 交換資源return *this; // tmp離開作用域自動析構舊資源
}

在這里插入圖片描述
這里是引用

方法對比

實現方式內存安全異常安全代碼簡潔度
傳統深拷貝???中等
現代寫法??

現代寫法的核心優勢:異常安全自賦值安全。傳參過程自動完成拷貝,避免手動檢查。

三、關鍵功能實現
1. 容量管理
size_t size()const
{return _size;//返回個數大小
}size_t capacity()const
{return _capacity;//返回容量大小
}// 擴容(不影響數據)
void reserve(size_t n) {if (n > _capacity) {char* tmp = new char[n + 1];memcpy(tmp, _str, _size + 1);delete[] _str;_str = tmp;_capacity = n;  // 更新容量}
}// 調整大小(影響數據)
void resize(size_t n, char ch = '\0') {if (n < _size) {  // 縮小,刪數據_size = n;_str[_size] = '\0';//直接在_size位置截斷} else {          // 擴大reserve(n);   // 確保容量for (size_t i = _size; i < n; i++)_str[i] = ch;  // 填充字符_size = n;_str[_size] = '\0';}
}

容量操作對比

方法功能時間復雜度是否影響數據
reserve()預分配內存O(N)?
resize()調整字符串長度O(N)?
2. 訪問操作
//[]運算符重載
char& operator[](size_t pos)
{assert(pos < _size);return _str[pos];}const char& operator[](size_t pos)const//不可修改
{assert(pos < _size);return _str[pos];
}//迭代器
typedef char* iterator;
typedef const char* const_iterator;
iterator begin()
{return _str;
}iterator end()
{return _str + _size;
}const_iterator begin()const
{return _str;
}const_iterator end()const
{return _str + _size;
}

我們自己實現的迭代器可以用原生指針完成,但是并不是所有的迭代器都是指針(雖然底層依舊還是指針)
在這里插入圖片描述
這是vs底下string迭代器的類型,你會發現他用一個類封裝了(考慮到各種原因)
typeid().name()可以看到變量的類型
在這里插入圖片描述
我們屏蔽掉end(),發現編譯器報錯“此基于范圍的"for“語句需要適合的"end"函數,但未找到”,間接證明范圍for容器遍歷實際就是替換為迭代器

3. 數據修改操作
// 尾部追加字符
void push_back(char c) {if (_size == _capacity)reserve(_capacity ? _capacity*2 : 4);  // 指數擴容_str[_size++] = c;_str[_size] = '\0';
}void  append(const char* str)
{size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}memcpy(_str + _size, str, len + 1);_size += len;}
// 插入字符串
void insert(size_t pos, const char* str) {assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity)reserve(_size + len);  // 精確擴容// 移動現有字符(從后向前)size_t end = _size;//要注意end是size_t類型,當end = -1 ->42以多的數字恒大于pos//把end改為int也不行,關系運算符兩邊類型不同會出現整型提升while (end >= pos && end != npos)//nops是公共成員變量 = -1{_str[end + len] = _str[end];end--;}// 插入新內容memcpy(_str + pos, str, len); // 避免循環_size += len;
}// 刪除操作
void erase(size_t pos = 0, size_t len = npos) {assert(pos < _size);if (len == npos || pos + len >= _size) { _str[pos] = '\0';  // 截斷至pos處_size = pos;} else {memmove(_str + pos, _str + pos + len, _size - pos - len + 1);_size -= len;}
}string& operator+=(char ch)
{push_back(ch);return *this;
}string& operator+=(const char* str)
{append(str);return *this;
}

性能技巧:使用memmove而非循環移位,處理內存重疊更安全。

4. 字符串操作
// 查找字符
size_t find(char ch, size_t pos = 0) const {for (; pos < _size; pos++){if (_str[pos] == ch){ return pos;}}	return npos;
}// 查找子串
size_t find(const char* s, size_t pos = 0) const {const char* ptr = strstr(_str + pos, s); // 庫函數優化return ptr ? ptr - _str : npos;
}// 獲取子串
string substr(size_t pos = 0, size_t len = npos) const {if (len == npos || pos + len > _size)len = _size - pos;  // 自動調整長度string result;result.reserve(len);for (size_t i = 0; i < len; i++)result += _str[pos + i];  // 支持鏈式追加return result;  // 返回值優化(RVO)
}
四、運算符重載與IO
1. 關系運算符
// 字典序比較
bool operator<(const string& str) const {size_t i = 0;while (i < _size && i < str._size) {if (_str[i] != str[i]) return _str[i] < str[i];i++;}return _size < str._size;  // 前綴相同比長度
}// 基于<和==實現其他運算符
bool operator==(const string& str) const { return _size == str._size && memcmp(_str, str._str, _size) == 0;
}bool operator!=(const string& str) const { return !(*this == str); 
}
// <=, >, >= 類似實現...
bool string::operator<=(const string& str)const
{return (*this < str) || (*this == str);
}bool string::operator>(const string& str)const
{return !(*this <= str);
}
bool string:: operator>=(const string& str)const
{return !(*this < str);
}

operator<()
“hello” “hello” --false
“hellox” “hello” – false
“hello” "hellox’ --true

2. 流操作符
// 輸出(支持含'\0'的字符串)ostream& operator<<(ostream& out, const string& str) {for (size_t i = 0; i < str.size(); i++) out << str[i];  // 避免c_str()的'\0'截斷return out;
}// 輸入(帶緩沖區優化)istream& operator>>(istream& in, string& str) {str.clear();        // 清空目標char buff[128];     // 減少擴容次數size_t i = 0;char ch = in.get();while (isspace(ch)) ch = in.get();  // 跳過空白while (!isspace(ch)) {buff[i++] = ch;if (i == 127) {                 // 緩沖區滿buff[i] = '\0';str += buff;                 // 批量追加i = 0;                      // 重置}ch = in.get();}if (i > 0) {                        // 處理剩余buff[i] = '\0';str += buff;}return in;
}

在這里插入圖片描述
這里是引用

<<和>> 不要在類里重載,因為會有個隱藏的this指針占據第一個位置
輸入優化:緩沖區減少+=操作次數,降低擴容開銷。


四.總結

通過系統的學習string類,我們學會了使用,在面對字符串或字符的時候就可以用string類,提高效率,并且通過完整的模擬實現可深入理解:動態內存管理深/淺拷貝操作符重載迭代器設計等C++核心概念。需知我們模擬實現不是為了造一個更好的輪子,已經有人給我們造出來了,我們直接使用就行了,關鍵在于學習人家的思路和想發,以及了解底層是如何工作的。

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

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

相關文章

Python進階【四】:XML和JSON文件處理

Python提供了多種處理XML和JSON文件的方式&#xff0c;讓我們來看看最常用的方法。 一、處理JSON文件 JSON在Python中處理起來非常簡單&#xff0c;因為它的結構與Python的字典(dict)和列表(list)幾乎一致。 常用模塊&#xff1a;json模塊 優點&#xff1a;Python標準庫自帶…

Golang | 搜索哨兵-對接分布式gRPC服務

哨兵&#xff08;centennial&#xff09;負責接待客人&#xff0c;直接與調用方對接。哨兵的核心組件包括service HUB和connection pool。service HUB用于與服務中心通信&#xff0c;獲取可提供服務的節點信息。connection pool用于緩存與index worker的連接&#xff0c;避免每…

CSS3實現的賬號密碼輸入框提示效果

以下是通過CSS3實現輸入框提示效果的常用方法&#xff0c;包含浮動標簽和動態提示兩種經典實現方案&#xff1a; 一、浮動標簽效果 <div class"input-group"><input type"text" required><label>用戶名</label> </div><…

maven編譯時跳過test過程

如果代碼里有無法在打包環境中測試的部分&#xff0c;則直接運行mvn clean package&#xff0c;因為測試失敗&#xff0c;會導致打包失敗。目前有兩種方式可以跳過測試&#xff1a; 1. mvn clean package -DskipTests&#xff0c;這會跳過執行階須&#xff0c;但仍會生成測試所…

美業+智能體,解鎖行業轉化新密碼(2/6)

摘要&#xff1a;中國美業市場近年蓬勃發展&#xff0c;規模持續擴大&#xff0c;預計不久將突破萬億級別&#xff0c;但同時也面臨著諸多挑戰&#xff0c;如獲客成本攀升、服務質量不穩定、難以滿足消費者多元化個性化需求等。智能體技術的出現為美業帶來了新的發展機遇&#…

設計模式——責任鏈設計模式(行為型)

摘要 責任鏈設計模式是一種行為型設計模式&#xff0c;旨在將請求的發送者與接收者解耦&#xff0c;通過多個處理器對象按鏈式結構依次處理請求&#xff0c;直到某個處理器處理為止。它包含抽象處理者、具體處理者和客戶端等核心角色。該模式適用于多個對象可能處理請求的場景…

react/vue移動端項目,刷新頁面404的原因以及解決辦法

一 、 項目 移動端 二、背景 1、問題描述&#xff1a;react/vue移動端項目&#xff0c;正常的頁面操作跳轉&#xff0c;不會出現404的問題&#xff0c;但是一旦刷新&#xff0c;就會出現404報錯 2、產生原因&#xff1a; React Router是客戶端的路由&#xff0c;當再次刷新時…

數據結構-算法學習C++(入門)

目錄 03二進制和位運算04 選擇、冒泡、插入排序05 對數器06 二分搜索07 時間復雜度和空間復雜度08 算法和數據結構09 單雙鏈表09.1單雙鏈表及反轉09.2合并鏈表09.2兩數相加09.2分隔鏈表 013隊列、棧、環形隊列013.1隊列013.2棧013.3循環隊列 014棧-隊列的相互轉換014.1用棧實現…

用JS實現植物大戰僵尸(前端作業)

1. 先搭架子 整體效果&#xff1a; 點擊開始后進入主場景 左側是植物卡片 右上角是游戲的開始和暫停鍵 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

深入理解設計模式之代理模式

深入理解設計模式之&#xff1a;代理模式 一、什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一種結構型設計模式。它為其他對象提供一種代理以控制對這個對象的訪問。代理對象在客戶端和目標對象之間起到中介作用&#xff0c;可以在不改變目標…

Ubuntu設置之初始化

安裝SSH服務 # 安裝 OpenSSH Server sudo apt update sudo apt install -y openssh-server# 檢查 SSH 服務狀態 sudo systemctl status ssh # Active: active (running) since Sat 2025-05-31 17:13:07 CST; 6s ago# 重啟服務 sudo systemctl restart ssh自定義分辨率 新…

【仿生機器人】極具前瞻性的架構——認知-情感-記憶“三位一體的仿生機器人系統架構

基于您的深度需求分析&#xff0c;我將為您設計一個全新的"認知-情感-記憶"三位一體的仿生機器人系統架構。以下是經過深度優化的解決方案&#xff1a; 一、核心架構升級&#xff08;三體認知架構&#xff09; 采用量子糾纏式架構設計&#xff1a; 認知三角&#xf…

Python量化交易12——Tushare全面獲取各種經濟金融數據

兩年前寫過Tushare的簡單使用&#xff1a; Python量化交易08——利用Tushare獲取日K數據_skshare- 現在更新一下吧&#xff0c;這兩年用過不少的金融數據庫&#xff0c;akshare&#xff0c;baostock&#xff0c;雅虎的&#xff0c;pd自帶的......發現還是Tushare最穩定最好用&…

python打卡day39@浙大疏錦行

知識點回顧 圖像數據的格式&#xff1a;灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 1. 圖像數據格式 - 灰度圖像 &#xff1a;單通道&#xff0c;像素值范圍通常0-255&#xff0c;形狀為…

源碼解析(二):nnUNet

原文 &#x1f600; nnU-Net 是一個用于生物醫學圖像分割的自配置深度學習框架&#xff0c;可自動適應不同的數據集。可用于處理和訓練可能規模龐大的二維和三維醫學圖像。該系統分析數據集屬性并配置優化的基于 U-Net 的分割流程&#xff0c;無需手動參數調整或深度學習專業知…

clickhouse如何查看操作記錄,從日志來查看寫入是否成功

背景 插入表數據后&#xff0c;因為原本表中就有數據&#xff0c;一時間沒想到怎么查看插入是否成功&#xff0c;因為對數據源沒有很多的了解&#xff0c;這時候就想怎么查看下插入是否成功呢&#xff0c;于是就有了以下方法 具體方法 根據操作類型查找&#xff0c;比如inse…

udp 傳輸實時性測量

UDP&#xff08;用戶數據報協議&#xff09;是一種無連接的傳輸協議&#xff0c;適用于實時性要求較高的應用&#xff0c;如視頻流、音頻傳輸和游戲等。測量UDP傳輸的實時性可以通過多種工具和方法實現&#xff0c;以下是一些常見的方法和工具&#xff1a; 1. 使用 iperf 測試…

pikachu通關教程- over permission

如果使用A用戶的權限去操作B用戶的數據&#xff0c;A的權限小于B的權限&#xff0c;如果能夠成功操作&#xff0c;則稱之為越權操作。 越權漏洞形成的原因是后臺使用了 不合理的權限校驗規則導致的。 水平越權 當我們以Lucy賬號登錄&#xff0c;查詢個人信息時&#xff0c;會有…

nc 命令示例

nc -zv 實用示例 示例 1&#xff1a;測試單個 TCP 端口&#xff08;最常見&#xff09; 目標&#xff1a; 檢查主機 webserver.example.com 上的 80 端口 (HTTP) 是否開放。 nc -zv webserver.example.com 80成功輸出&#xff1a; Connection to webserver.example.com (19…

Redis是什么

注&#xff1a;本人不懂Redis是什么&#xff0c;問的大模型&#xff0c;讓它用生動淺顯的語言向我解釋。為了防止忘記&#xff0c;我把它說的記錄下來。接下來的解釋都是大模型生成的&#xff0c;如果有錯誤的地方歡迎指正 。 Redis 是什么&#xff1f;&#xff08;一句話解釋&…