C++修煉:string類的使用

????????Hello大家好!很高興我們又見面啦!給生活添點passion,開始今天的編程之路!

我的博客:<但凡.

我的專欄:《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C++修煉之路》

歡迎點贊,關注!

1、string類初識

?????????<string>?是 C++ 標準庫中用于處理字符串的頭文件。我們可以用string提供的豐富的接口來實現各種各樣的字符串操作。string類的底層其實就是順序表,只不過在存儲字符的同時還多存儲了一個‘\0’。再后續的使用講解中大家會感受到string的強大。

? ? ? ? 使用string類需要包含頭文件:

#include<iostream>
#include<string>

? ? ? ? ?好的現在我盡量用最直白的語言告訴大家為什么這個string類非常方便。

#include<iostream>
#include<string>
using namespace std;
int main()
{string s="Hello World!";cout << s;
}

?

? ? ? ? 我們創建了一個helloworld字符串,并且把他打印了出來。現在的字符串就像int, char一樣是一個類型,我們不需要再去像C語言一樣再去創建字符數組啊什么什么的。但是不僅如此,string類提供了非常多的接口,所以我們可以隨便的在這個字符串中增刪查改。具體怎么增刪查改,我們繼續往下看。

2、迭代器

? ? ? ? 我們可以把迭代器理解成和指針差不多的東西。因為我們想訪問它都得解引用。

? ? ? ? 對于迭代器類型的接收我們可以使用auto,auto可以自動識別變量的類型。但需要注意的是auto這個東西不推薦多用,因為很可能會識別錯誤。

auto不能作為函數的參數,可以做返回值,但是建議謹慎使用 。auto不能直接用來聲明數組

?

? ? ? ? 這些都是string類中返回迭代器的接口,我們一個一個來介紹:

2.1、begin和end

? ? ? ? ?begin是返回該字符串中第一個字符位置的迭代器,end是返回該字符串最后一個字符位置的下一位的迭代器(也就是‘\0’的位置)。我們可以使用begin和end對字符串進行遍歷:

#include<iostream>
#include<string>
using namespace std;
int main()
{string s="Hello World!";auto it1 = s.begin();auto it2 = s.end()-1;while (it1 != it2){cout << *it1 << " ";it1++;}
}

輸出結果:

?

? ? ? ? ?注意我們這里沒讓他輸出感嘆號!

????????有幾個細節需要提一下:第一,我們的迭代器是支持+-操作的,+就是讓迭代器挪到下一個位置,-與+相反。

第二,我們迭代器的比較其實是非常嚴格的,所以盡量使用 != 和== 來比較。

?2.2、rbegin和rend

? ? ? ? 這個rbegin和rend就有意思了啊,它實際上就是和begin和end進行了一個對調,rbegin返回的是整個字符串最后一個字符的位置,而rend返回的是第一個字符的位置的前一個。但需要注意,++begin其實是往前走,向前遍歷。也就是說我們現在從字符串最后向前是正方向。

?

#include<iostream>
#include<string>
using namespace std;
int main()
{string s="Hello World!";auto it1 = s.rbegin();auto it2 = s.rend();while (it1 != it2){cout << *it1 << " ";it1++;}
}

?

? ? ? ? ?需要注意一點,我們不能執行rbegin-1的操作,因為rbegin-1這個位置雖然物理內存上是存在的,但是對于反向迭代器來說是不合法的,屬于越界訪問。

2.3、cbegin、cend、crbegin、crend

? ? ? ? 這四個迭代器其實和上面我們介紹過的四個指向的位置沒有區別,但是他們迭代器的類型變成了const_iterator。也就是說,我們迭代器指向的這一塊內存存放的內容是不可以被修改的。

#include<iostream>
#include<string>
using namespace std;
int main()
{string s = "Hello World!";auto it1 = s.begin();(*it1)++;auto it2 = s.cbegin();(*it2)++;//報錯:表達式必須是可修改的左值
}

? ? ? ? 實際上后面四個我們不常用。

????????如果我們在不使用auto的情況接收以下兩種情況的迭代器,必須使用const_iterator:

void test(const string& s)
{string::const_iterator it = s.begin();string p = "asd";string::const_iterator it2 = p.cbegin();
}

? ? ? ?注意以下兩串代碼表達的意思并不相同,第一個是指迭代器的指向不能改變,也就是不能執行it2++這樣的操作,而第二個是迭代器的指向的內容不能被修改。

	const string::iterator it2 = p.begin();string::const_iterator it = p.begin();

?3、capacity

以下是我們這一部分要介紹的接口:

3.1、size、length和max_size

? ? ? ? 其實這兩個接口都是返回字符串的長度。size()是為了和后面STL里面其他容器的接口一致而后設計出來的。我們一般使用size,不使用length。

? ? ? ? max_length就是返回我們這個字符串能夠容納的最大長度。

#include<iostream>
#include<string>
using namespace std;int main()
{//兩種定義string的方式string s = "Hello World!";//隱式類型轉換string s1("abc");cout << s.size() << endl;//包含空格cout << s1.size()<< endl;cout << s1.length() << endl;cout << s.max_size() << endl;//輸出2147483647
}

輸出結果:

?3.2、resize

? ? ? ? resize可以將字符串大小調整為 n 個字符的長度。

? ? ? ? 如果n小于當前字符串的長度,就會對該字符串進行截取,如果n大于當前字符串的長度,多余的位置用我們指定的字符串進行補充。如果沒有指定就用\0補充。

#include<iostream>
#include<string>
using namespace std;int main()
{//兩種定義string的方式string s = "Hello World!";//隱式類型轉換s.resize(5);cout << s << endl;s.resize(50);cout << s << endl;s.resize(100, 'c');cout << s << endl;
}

輸出結果:

?

?3.3、capacity

? ? ? ? capacity可以返回當前為字符串分配的存儲空間的大小,以字節表示。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";cout << s.capacity() <<endl;
}

輸出結果:

?

? ? ? ? 現在我們可以把capacity用來觀察編譯器對string容量的自動擴容。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";for (int i = 1;i <= 10;i++){s += "ssssssssss";//每次尾插10個字符cout << s.capacity() << endl;}
}

輸出結果:

?

3.4、reserve

????????reserve根據計劃的大小更改調整字符串容量,長度最多為 n 個字符。如果我們給的容量小于當前容量,他并不會縮小容量。這意味著他不會改變當前字符串的內容。但我說的不會縮小是針對我是用的編譯器vs2022來說的,不同環境下可能有不同的結果,可能縮也可能不縮。

????????但需要注意的是,如果給的大小大于當前的容量,他也不會嚴格按照你給的容量進行擴容,由于底層內存對齊規則和編譯器的優化(這不在討論的范圍內),他只會大于或等于你要求他擴容到的大小。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";cout << s.capacity() << endl;//15s.reserve(5);cout << s.capacity() << endl;//15s.reserve(20);cout << s.capacity() << endl;//31s.reserve(40);cout << s.capacity() << endl;//47
}

?輸出結果:

? ? ? ? 所以說這個東西大家盡量別用,很可怕,用戶對于容量的可控性很低。

3.5、clear和empty

? ? ? ? clear可以情況當前串,使它變成空串,而empty可以判斷當前串是不是空串。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";cout << s.empty() << endl;//0s.clear();cout << s.empty() << endl;//1
}

輸出結果:

?

4、Element access

? ? ? ? 這里我們介紹幾種接口用來訪問元素。

4.1、方括號

? ? ? ? 首先是最常用的方括號訪問元素。這里的訪問我們就把字符串看成一個下標從0開始的字符數組就好。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";cout << s[0] << endl;cout << s[12] << endl;//訪問'\0
}

輸出結果:?

4.2、at

? ? ? ? at也可以訪問特定下標的元素:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";cout << s[0] << endl;cout << s[12] << endl;//訪問'\0cout << s.at(0) << endl;cout << s.at(4) << endl;
}

輸出結果:

?

? ? ? ? 需要注意,方括號訪問越界是直接斷言報錯,而at訪問越界是拋異常(我們之前介紹過異常)。但是只有debug版本才會斷言報錯,realease版本斷言就被忽略了。

?4.3、back和front

? ? ? ? 這兩個C++11新增的接口就是返回字符串首尾元素,沒啥好說的、

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello World!";cout << s.front() << endl;cout<<s.back()<<endl;
}

輸出結果:

?

?5、Modifiers

? ? ? ? 這里我們介紹幾個修改我們字符串的接口。

?????????

5.1、+=,insert和erase

? ? ? ? 之所以先介紹這三個,是因為這三個使我們最常用的。

? ? ? ? 首先來說+=,這個+=就是運算符重載了,可以支持我們的字符串相加:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";s += " World!";cout<<s<<endl;
}

輸出結果:

?

? ? ? ? ?接下來再來看insert,他可以支持我們在字符串中任意位置插入數據:

????????我們可以看一下,他支持了這么多函數重載。 現在我們挑幾個來實驗一下:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";s.insert(0, 1, '*');//在下標為0,傳入1個字符,內容為*cout<<s<<endl;s.insert(s.begin(), '&');//在begin迭代器指向的位置插入&cout << s << endl;s.insert(5, "pppppp");//從下標為5的位置插入字符串//注意下標為5的位置被改變了cout << s << endl;
}

輸出結果:

?

?????????erase支持我們在指定的位置進行刪除。

?使用案例:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";s.erase(s.begin());//刪掉迭代器指向位置的cout << s << endl;s.erase(0, 2);//從下標0開始,刪掉兩個字符cout << s << endl;s.erase(0, string::npos);//從下標0開始,刪掉npos個字符,實際上就刪完了,我們后面會介紹nposcout << s << endl;s += "yyy";s.erase(s.begin(), s.end());//刪除所有字符cout << s << endl;
}

輸出結果:

?5.2、append

? ? ? ? append可以在字符串末尾追加字符串。他既可以追加string字符串,也可以追加c風格字符串還可以追加多個字符,甚至還支持追加迭代器范圍內的字符。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";s.append("ssss");//追加c風格string s1 = "***";s.append(s1);s.append(10, '@');//追加多個字符s.append(s.begin(), s.end());//相當于把這個字符串復制一遍加上去cout << s << endl;
}

輸出結果:

5.3、push_back

????????這個也是尾插,沒啥好說的。 但是這個只能插入單個字符。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";s.push_back('H');cout << s << endl;
}

?5.4、assign

? ? ? ? assign可以以多種方式替換字符串的內容。

?使用案例:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";string s1("ppp");s.assign(s1);//另一串賦值cout << s << endl;s.assign("sssss");//c風格字符串cout << s << endl;s.assign(10,'o');//多個字符cout << s << endl;s.assign("*********", 2, 4);//從給定的string串下標2開始以后的4個字符進行替換cout << s << endl;string s2 = "666";s.assign(s1.begin(), s1.end());//迭代器cout << s << endl;
}

輸出結果:

?

5.5、replace

? ? ? ? 這個replace也是替換,但是他更靈活,我們可以自己指定需要替換的范圍。在這我就簡單列舉幾個例子:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";string s1("ppp");s.replace(2,3,s1);//從2開始替換3個字符為s1cout << s << endl;s.replace(2, 3,"sssss");//c風格字符串cout << s << endl;s.replace(2,10,5,'o');//從2開始以后10個字符替換為5個'o’cout << s << endl;
}

輸出結果:

? ? ? ? ?replace要謹慎使用因為如果替換的長度不對等他需要自己挪動數據,消耗時間。

?5.6、swap

? ? ? ? 這個就是單純的替換,沒啥好說的。但需要注意的是這個交換是string特有的只能交換字符串的淺拷貝,效率比算法庫自帶的swap更高。下一篇我們還會展開說這個地方。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";string s1("ppp");s.swap(s1);cout << s << endl;
}

?

5.7、pop_back

? ? ? ? pop_back可以刪除最后一個字符?(注意不是‘\0’)。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";s.pop_back();cout << s << endl;
}

輸出結果:?

????????好了這部分也算是講完了。大家應該可以感受得到,實際上string類在這地方設計的還是比較冗余的,有很多功能都是重復的。?

6、string operations

?6.1、c_str、data和copy

? ? ? ? 這個主要是讓我們的string類型字符串以c風格返回。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";cout << s.c_str() << endl;
}

輸出結果:

? ? ? ? data的作用和c_str類似,但是在不同的標準中有一些區別。這個不過多說了因為不常用。

? ? ? ? copy可以將string串中的字符拷貝到字符數組中,但是必須手動添加終止符:

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello";char s1[100] = " ";s.copy(s1,s.size());s1[5] = '\0';cout << s1 << endl;
}

?輸出結果:

?6.2、find和rfind

? ? ? ? 這個是比較常用的,他可以支持我們以多種方式查找string串中出現的字符或字符串。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello***&&&@@";cout << s.find('*', 0) << endl;//5cout << s.find("*&", 0) << endl;//支持C風格字符串查找cout << s.find("9", 0) << endl;//未找到返回nposcout << s.find("*&#",0,2) << endl;//指定要查找我給定的C風格字符串的前兩個字符
}

輸出結果:

? ? ? ? 對于find來說,只要沒找到,就返回npos,也就是字符串能容納下的最大長度。

? ? ? ? rfind就是倒著往前找,但需要注意的是如果我們想讓他查找完全整個串的話我給給定的應該是從最后一個字符得下標開始查找

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello***&&&@@";cout << s.rfind('*', 12) << endl;cout << s.rfind("*&", 12) << endl;//支持C風格字符串查找cout << s.rfind("9", 12) << endl;//未找到返回nposcout << s.rfind("*&#",12,2) << endl;//指定要查找我給定的C風格字符串的前兩個字符
}

?輸出結果:

?6.3、find_first_of和find_last_of

? ? ? ? find_first_of可以查找整個串中從前往后第一次出現這個字符或者給定的字符串中任意一個字符的位置。他經常用于檢驗這個字符串中是否包含某個特定字符。他和find的區別就是,就算給定的串與string串不完全匹配也沒關系,只要包含其中的一個字符就好。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello***&&&@@";cout << s.find_first_of('*', 0) << endl;cout << s.find_first_of("*&", 0) << endl;//支持C風格字符串查找cout << s.find_first_of("9", 0) << endl;//未找到返回nposcout << s.find_first_of("*&#", 0,2) << endl;//指定要查找我給定的C風格字符串的前兩個字符
}

?輸出結果:

?

? ? ? ? find_last_of就是和find_first_of反過來到這往前找而已,沒啥好說的。

?6.4、find_first_not_of和find_last_not_of

? ? ? ? 這兩個其實就是字面意思,查找第一個不是該字符或字符串的位置。一個是從前往后找,一個是從后往前找。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello***&&&@@";cout << s.find_first_not_of('H', 0) << endl;//cout << s.find_first_not_of("*&", 0) << endl;//支持C風格字符串查找cout << s.find_first_not_of("9", 0) << endl;//未找到返回nposcout << s.find_first_not_of("*&#", 0,2) << endl;//指定要查找我給定的C風格字符串的前兩個字符
}

?輸出結果:

?6.5、substr

? ? ? ? substr可以截取規定區域的字符串。但需要注意的是substr并不會改變原字符串。

#include<iostream>
#include<string>
using namespace std;int main()
{string s = "Hello***&&&@@";cout << s.substr(0,5) << endl;
}

輸出結果:

?6.6、compare

? ? ? ? compare就是字符串比較,和C語言里面的strcmp差不多的道理,都是字典序進行排序。

#include<iostream>
#include<string>
using namespace std;int main()
{//大寫字母ASCII碼比小寫字母小//按照字典序排序string s = "Hello";cout << s.compare("Assaa") << endl;string s1 = "Hello";cout << s.compare(s1) << endl;cout << s.compare(0, 3, s1) << endl;//s的0到3個字符和s1作比較cout << s.compare(0, 3, s1, 0, 3) << endl;//s的0到3個字符和s1的0到3個字符作比較}

輸出結果:

? ? ? ? 返回1表示s大于我們傳入的字符串,0表示相等,-1表示s小于我們傳入的字符串。

?7、getline

????????getline就是讀取當前這一行。什么意思?我們的scanf和cin都不能讀取包含有空格的字符串,所以我們得用getline讀取這一行能夠讀取空格。

#include<iostream>
#include<string>
using namespace std;int main()
{//輸入hello worldstring s;cin >> s;//hellocin.ignore(256, '\n');//刷新緩沖區,把剩下的world清掉string s2;getline(cin,s2);cout << s << endl;cout << s2 << endl;
}

?輸出結果:

? ? ? ? 好了,今天的內容就分享到這,我們下期再見!

?

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

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

相關文章

【go微服務】如何快速掌握grpc開發

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

【區塊鏈 + 文化版權】基于 FISCO BCOS 的方言大數據語料庫 | FISCO BCOS 應用案例

蘇州喵自在區塊鏈科技有限公司打造的基于FISCO BCOS 的粵語大數據語料庫&#xff0c; 旨在利用區塊鏈技術保護和發展粵語文化遺產。該項目利用區塊鏈的不可篡改性、分布式存儲、智能合約和激勵機制等特性&#xff0c; 為保護非物質文化遺產&#xff0c; 加強粵語研究與教育和開…

大模型在支氣管擴張預測及治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 1.3 國內外研究現狀 二、大模型技術概述 2.1 大模型的基本原理與架構 2.2 適用于支氣管擴張預測的大模型類型及特點 2.3 大模型在醫療領域的應用現狀與優勢 三、支氣管擴張的相關醫學知識 3.1 支氣管擴張的病因…

亞馬遜云科技提供完全托管的DeepSeek-R1模型

近日&#xff0c;亞馬遜云科技宣布在Amazon Bedrock上線完全托管的DeepSeek-R1模型。DeepSeek是首個登陸Amazon Bedrock的國產大模型&#xff0c;自今年1月底推出以來&#xff0c;已有數千客戶使用Amazon Bedrock的自定義模型導入功能部署了DeepSeek-R1模型。 DeepSeek在過去幾…

二叉樹、排序算法與結構圖

二叉樹、排序算法與數據庫 二叉樹 二叉樹的性質 節點數與深度的關系&#xff1a;深度為 k k k的二叉樹&#xff0c;最多有 2 k ? 1 2^k - 1 2k?1個節點。例如&#xff0c;深度為 3 3 3的二叉樹&#xff0c;最多有 2 3 ? 1 7 2^3 - 1 7 23?17個節點。葉子節點與度為2節…

vmwaretools解壓失敗|vmware tools distrib cannot mkdir read only file system|bug匯總

最簡單的一條路線&#xff1a;你的解壓命令用sudo了嗎&#xff1f; 這個方法不能解決的話就看下面內容。本文提供給你全過程思路。 如需轉載&#xff0c;標記出處 背景&#xff1a; 之前虛擬機和主機的復制黏貼還能用&#xff0c;今天突然用不了&#xff0c;重新下載安裝包&am…

jEasyUI 創建自定義視圖

jEasyUI 創建自定義視圖 引言 jEasyUI 是一款流行的 jQuery UI 組件庫&#xff0c;它提供了豐富的 UI 組件和交互效果&#xff0c;極大地簡化了 Web 開發的復雜度。在 jEasyUI 中&#xff0c;我們可以通過自定義視圖來擴展其功能&#xff0c;滿足特定的業務需求。本文將詳細介…

Spring MVC配置詳解:從歷史到實戰

文章目錄 一、Java Web的發展歷程1.Model I與Model II開發模式&#xff08;1&#xff09; Model I開發模式&#xff08;2&#xff09;Model II開發模式 2.MVC設計模式Spring MVC本質MVC工作流程 二、Spring MVC快速入門實戰1.環境搭建步驟&#xff08;1&#xff09;創建Maven W…

老是忘記package.json,備忘一下 webpack 環境下 Vue Cli 和 Vite 命令行工具對比

Vue 2.X webpack 環境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…

【樹莓派Pico FreeRTOS】-Mutex(互斥體)

Mutex(互斥體) 文章目錄 Mutex(互斥體)1、硬件準備2、軟件準備3、FreeRTOS的Mutex介紹4、完整示例RP2040 由 Raspberry Pi 設計,具有雙核 Arm Cortex-M0+ 處理器和 264KB 內部 RAM,并支持高達 16MB 的片外閃存。 廣泛的靈活 I/O 選項包括 I2C、SPI 和獨特的可編程 I/O (P…

sock文件介紹--以mysql.sock為例

socket 文件 (.sock) 通常是臨時文件。 MySQL 的 socket 文件是臨時文件&#xff0c;只在服務運行時有效。可通過配置文件更改 socket 文件的存放路徑&#xff0c;常見路徑如 /tmp/mysql.sock 或指定自定義目錄。如果連接出現問題&#xff0c;可能需要檢查 MySQL 服務狀態或路…

Docker應用部署之mysql篇(day5)

文章目錄 前言一、問題描述二、解決方案1. 搜索 MySQL 鏡像2. 拉取 MySQL 鏡像3. 創建并運行 MySQL 容器參數說明&#xff1a; 4. 驗證容器是否運行5. 進入 MySQL 容器 三、總結 前言 在日常開發和部署中&#xff0c;MySQL 是最常用的關系型數據庫之一。借助 Docker&#xff0…

【Elasticsearch基礎】基本核心概念介紹

Elasticsearch作為當前最流行的分布式搜索和分析引擎&#xff0c;其強大的功能背后是一套精心設計的核心概念體系。本文將深入解析Elasticsearch的五大核心概念&#xff0c;幫助開發者構建堅實的技術基礎&#xff0c;并為高效使用ES提供理論支撐。 1 索引&#xff08;Index&…

Qt在ARM中,如何使用drmModeObjectSetProperty 設置 Plane 的 zpos 值

在 Qt 中直接使用 drmModeObjectSetProperty 設置 Plane 的 zpos 值需要結合 Linux DRM/KMS API 和 Qt 的底層窗口系統&#xff08;如 eglfs 平臺插件&#xff09;。以下是詳細步驟和代碼示例&#xff1a; 1. 原理說明 DRM/KMS 基礎&#xff1a; Plane&#xff1a;負責圖層合成…

MFC添加免費版大漠3.1233

先創建一個MFC工程&#xff0c; 添加dm.dll 方法一&#xff1a;通過類向導-添加類-類型庫中的MFC類-文件&#xff0c;選擇dm.dll&#xff0c;如果沒有"添加類型庫中的MFC類"選項就用方法二添加 方法二&#xff1a;添加-新建項-MFC-Active或TypeLib-實現接口位置選…

【Linux】應用層協議 HTTP

應用層協議 HTTP 一. HTTP 協議1. URL 地址2. urlencode 和 urldecode3. 請求與響應格式 二. HTTP 請求方法1. GET 和 POST (重點) 三. HTTP 狀態碼四. HTTP 常見報頭五. 手寫 HTTP 服務器 HTTP&#xff08;超文本傳輸協議&#xff09;是一種應用層協議&#xff0c;用于在萬維網…

【活動回顧】StarRocks Singapore Meetup #2 @Shopee

3 月 13 日&#xff0c;StarRocks 社區在新加坡成功舉辦了第二場 Meetup 活動&#xff0c;主題為“Empowering Customer-Facing Analytics”。本次活動在 Shopee 新加坡辦公室舉行&#xff0c;吸引了來自 Shopee、Grab 和 Pinterest 的專家講師以及 50 多位參會者。大家圍繞電商…

Retinexformer:基于 Retinex 的單階段 Transformer 低光照圖像增強方法

開頭發點牢騷&#xff1a;本來做的好好都都要中期了&#xff0c;導師怎么突然給我換題目啊。真是繃不住了......又要從頭開始學了&#xff0c;唉&#xff01; 原論文鏈接&#xff1a;Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement 低光…

后端——AOP異步日志

需求分析 在SpringBoot系統中&#xff0c;一般會對訪問系統的請求做日志記錄的需求&#xff0c;確保系統的安全維護以及查看接口的調用情況&#xff0c;可以使用AOP對controller層的接口進行增強&#xff0c;作日志記錄。日志保存在數據庫當中&#xff0c;為了避免影響接口的響…

flink廣播算子Broadcast

文章目錄 一、Broadcast二、代碼示例三.或者第二種(只讀取一個csv文件到廣播內存中)提示:以下是本篇文章正文內容,下面案例可供參考 一、Broadcast 為了關聯一個非廣播流(keyed 或者 non-keyed)與一個廣播流(BroadcastStream),我們可以調用非廣播流的方法 connect(),…