c++string類型

概述

string類型是c++的字符串類型,其繼承自basic_string類。

使用string需要導入頭文件#include <string>,并且在命名空間std下。

c++string是否是寫時復制? (像Qt的string一樣)?

經過自己的測試,推斷,c++的方式不是寫時復制,其在賦值的階段就會開辟新的空間。

?1.? 構造string類對象

  • ?? ?std::string str1("Hello World");
    ?? ?std::string str2;

  • ? ? std::string str3(20, '-');? ? ? ? ? ? ? ? ? ? ? ? ? ?// str3包含20個中劃線
    ?? ?std::string str4({ "Hello" }); ? ? ? ? ? ? ? ? ? ?// 使用初始化列表

  • ?? ?std::string str5(str1, 5);? ? ? ? ? ? ? ? ? ? ? ? ?//? 拷貝從str1第5個字符開始后面的字符
    ?? ?std::cout << str5 << std::endl;? ? ? ? ? ? ??// 輸出: World(注意W前面有個空格字符)

  • ? ? const char* str = "Jack"; ? ? ? ? ? ? ? ? ? ?
    ?? ?std::string str6(str, 2);? ? ? ? ? ? ? ? ? ? ? ? ? ?// 拷貝str字符串的前兩個字符
    ?? ?std::cout << str6 << std::endl;? ? ? ? ? ? ? // 輸出:Ja

2. ?string的訪問

  • ?使用下標
    std::cout << str1[0] ? ?<< std::endl; ? ? ? ? ? ? ? ? ? ? ? ? ?// 輸出: H ?使用下標運算符訪問第一? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 個字符,注意越界
    std::cout << str1.at(0) << std::endl; ? ? ? ? ? ? ? ? ? ? ? ?// 和下標運算符類似
  • 使用back()和front()
    std::cout << str1.back() << std::endl;? ? ? ? ? ? ? ? ? ?// 輸出d,返回最后一個字符
    str1.back() = 'e';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可以通過back()返回修改對應位置? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?字符
    std::cout << str1 << std::endl;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // Hello Worle

front()的使用方式類似。

  • 使用迭代器? ?--? ?其它迭代器的使用和前面容器是類似的

    std::string str1("Hello World");

    for (auto i : str1) {
    ?? ?std::cout << i << " "; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// H e l l o ? W o r l d
    }

這是c++11新增的for循環,可以對擁有迭代器的類方便遍歷,當然使用迭代器還可以像之前容器那樣去遍歷(不了解可以去容器章節查看),當然那樣寫起來比較麻煩。

3. string的長度?

  • ??? ?std::string str1("Hello World");
    ? ??
    ?? ?std::cout << str1.length()?? ??? ? ? << std::endl; ? ? // 11
    ?? ?std::cout << str1.size() ? ? ? ? ? << std::endl; ? ? // 11
    ?? ?std::cout << strlen(str1.c_str()) ?<< std::endl; ? ? // 11??

使用strlen需要導入頭文件#include??<string.h> 或者 #include <cstring>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

注意:? ? ? ? ? ? ? ? ?
c++所有計算字符串長度的函數,計算出的都是字符串的字節數。也就是所如果我們去計算"我愛你"這樣的中文字符串的長度,上面的函數都會返回6。因為在程序中一個中文一般占兩個字節。

4. c++字符串轉化為C語言字符串?

?在使用一些函數的時候,尤其是c的函數,我們需要傳入的字符串是C語言的字符串類型:char*,或者是const char*。

這時候我們可以通過c_str()函數將c++字符串轉化為C語言字符串。

str.c_str();? 其會返回一個const char*的字符串指針。

為什么呢??

string是c++關于處理字符串封裝的一個類,簡單來看,其內部就是存在一個char*的指針,然后內部會為它動態開辟空間。并且類中包含了一系列處理字符串的函數。
你使用c_str()它只是將這個指針給你返回回來了。

5. 字符串的容量?

  • std::string str1;?

    str1.reserve(20);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 開辟20個空間

    std::cout << str1.capacity() << std::endl;? ? ? ? ? ? ? ?// 打印string目前的容量

容量是指當前字符串對應的空間有多大,它并不等于字符串的長度。

它會根據內部的算法,進行空間的動態擴充,reserve是指定string開辟20個空間,但是實際打印出來并不是,因為它會根據內部的算法進行擴充。(感覺和vector容器是一樣的)

6. 字符串的查找?

  • find()?
    此函數可以用來查找string中存放字符串的特定字符和字串,并且可以指定查找位置。
  • 成功找到:? ?返回找到的第一個字符或者首字符的下標
    沒有找到:? ?返回npos
    如果指定查找的范圍超出字符串的范圍:? 結果未定義
  • std::string str1("Hello World");
    using size = std::string::size_type;? ? ? ? ? ? ?// 給strng內置的類型取一個別名,方便使用

  • size ret = str1.find("He");? ? ? ? ? ? ? ? ? ? ? ? ? ? // 查找子串"He",找到返回字段首字符的下? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 標,沒有找到返回npos
    std::cout << ret << std::endl;

  • size ret1 = str1.find("He", 5);? ? ? ? ? ? ? ? ? ? ? // 從下標為5的位置開始查找子串"He"找到返? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 回字段首字符的下標,沒有找到返回npos

  • size ret2 = str1.find('c');? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 查找字符c是否存在,存在返回下標找到返? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 回字段首字符的下標,沒有找到返回npos
    std::cout << ret2 << std::endl;??

  • size ret3 = str1.find("W", 5);? ? ? ? ? ? ? ? ? ? ? ?// 從下標為5的位置開始,查找字符‘w’是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 否存在,找到返回字段首字符的下標,沒? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 有找到返回npos
    ?std::cout << ret3 << std::endl;

  • rfind()就是從反方向查找,用法和find()類似

  • find_first_of() 查找第一次出現的子串或者字符

    std::string str1("Hello World");

    str1.find_first_of('H');
    str1.find_first_of('H',6);? ? ? ? ? ? ? ? ? ? ? ? ? // 從下標為6的位置開始查找
    str1.find_first_of("He",6);? ? ? ? ? ? ? ? ? ? ? // 從下標為6的位置開始查找
    str1.find_first_of("He");?

  • find_last_of() 查找最后一個出現的子串或者字符? --? 用法和上面的一樣

  • find_first_not_of() 查找第一個出現的與查找子串或者字符不匹配的下標
    size_t ret = str1.find_first_not_of('s');? ?// 第一個與s不匹配的下標為0

  • find_last_not_off() 和first相反

注意:? 1.? ? 如果查找的是子串,那么必須整個串都一樣,否則就是不匹配

? ? ? ? ? ?2.? ? 后面的四種方法也可以使用npos來判斷是否查找成功

6.1 如何判斷查找成功和失敗

?我們上面說到,查找成功返回對應子串或者字符的首字符下標,查找失敗返回npos。npos最開始被定義為-1,但是其并不是一直是-1,所以find()查找失敗不一定都返回-1。

看下面代碼:?

std::string str1("Hello World");
using size = std::string::size_type;

size ret = str1.find('s'); ? ? ? ? ? ? ? ? ? ? ? ? // 's'字符在字符串中沒有,所以其肯定找不到
if (ret == str1.npos) { ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 輸出: ?沒有找到
?? ?std::cout << "沒有找到" << std::endl;
}
else {
?? ?std::cout << str1[ret] << std::endl;
}

所以判斷是否查找失敗,我們可以使用其返回值(返回值類型可以是string內置的size_type也可以直接使用size_t)與npos進行比較如果等于npos就是沒有找到,找到就返回所在下標。

7. 判斷string是否為空

  • ?str1.empty();? ? ? ? ? ? ? ? //? 為空返回true,不為空返回false;

8. string的比較?

  • ?直接使用比較運算符進行比較? ?--? 比較規則和C語言字符串類似

    std::string str1("Hello World");
    std::string str2("Hello");

    if (str2 < str1) {
    ?? ?std::cout << "str2小于str1" << std::endl;
    }

  • 使用compare()函數進行比較

    std::string str1("Hello World");
    std::string str2("Hello");


    // str1和str2整體進行比較,相同返回0,str1小返回-1,str1大返回+1
    str1.compare(str2); ? ? ? ? ? ? ? ? ?


    // str1下標為[0,5)字符組成的字符串與str2進行比較,返回值和上面一樣
    int ret = str1.compare(0,5,str2);? ??

    // str1下標為[0,5)字符組成的字符串與str2下標為[0,5)的字符組成的字符串進行比較

    int ret2 = str1.compare(0, 5, str2, 0, 4);

注意:? 使用compare()可以指定比較兩個字符串對應區間內的字符串,但是如果我們指定的區間大于了原來字符串的長度,那么就默認使用字符串的size(),也就是字符串的長度。


舉例:?

int ret = str1.compare(0,20,str2);? ? ? ?// 我們這里指定的是str1的[0,20)的字符組成的字符串與str2進行比較,但是我們str1的長度是11,明顯20超出了str1的長度,這時候compare()函數就會使用str1.size()也就是str1的長度范圍的字符串,也就是[0,11),也就是整個字符串。

9. string的添加?

  • insert()函數

    std::string str1("Hello World");
    std::string str2("編程");
    ?

    str1.insert(5, "開心");?? ??? ??? ??? ??? ??? ?// 在下標為5的位置插入"開心"
    str1.insert(0, "美麗");?? ??? ??? ??? ??? ? ? ?// 在下標為0的位置插入"美麗"
    str1.insert(str1.size(), "漂亮"); ? ? ? ? ?// 在字符串的尾部添加"漂亮",因為尾部下標就是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 字符串的長度

    str1.insert(str1.begin(),'z');? ? ? ? ? ? ? ?// 在字符串開頭的位置插入字符'z'
    str1.insert(str1.end(), 'z');? ? ? ? ? ? ? ? // 在字符串尾部的位置插入字符'z'

    str1.insert(str1.begin(), 5, 'a');? ? ? ? ?// 在尾部添加5個a,首部也類似
    str1.insert(0, str2);? ? ? ? ? ? ? ? ? ? ? ? ? // 在下標為0的位置添加str2

    std::cout << str1 << std::endl;
    ?

  • 使用append()函數對字符串進行尾部添加
    ?
    str1.append("123"); ? ? ? ? ? ? ? ? ? ?// 尾部添加字符串"123"
    ?str1.append(str2);? ? ? ? ? ? ? ? ? ? ? // 尾部添加字符串str2

  • 直接使用+運算符進行拼接
    str1 += "123";? ? ? ? ? ? ? ? ? ? ? ? ? ? // 尾部拼接
    str1 = "123" + str1;? ? ? ? ? ? ? ? ? ?// 首部拼接
    注意:? 使用+直接拼接必須有一個string類對象,不能直接對C語言的字符串進行+,因為那都是地址。

10. string的刪除?

  • 使用下標? --? 刪除對應下標以及之后的所有數據或者相應數量的數據
    ? ? ? ? ? ? ? ? ? ? 返回值:? ? 返回刪除后的string對象

    std::string str1("Hello World");
    std::string str2;

    str2 = str1.erase(2);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 刪除下標為2開始的所有字符
    std::cout << str1 << std::endl;
    std::cout << str1 << std::endl;? ? ? ? ? ? ? ? ? ? // 輸出和str1是一樣的

    str1.erase(2,3);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??// 刪除從下標為2開始的三個字符,同理也是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回刪除后的string對象(和上面是一樣的)
    std::cout << str1 << std::endl;
    ?

  • 使用迭代器? ?--? ?刪除迭代器指向數據,或者迭代器范圍的數據
    ? ? ? ? ? ? ? ? ? ? ? ? ? 返回值:? ?返回指向刪除字符或者字符串的后一個位置字符的迭代器,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如果刪除的字符后面已經沒有字符了,返回end()迭代器(就是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指向最后一個元素的下一個位置的迭代器)

    str1.erase(str1.begin()); ? ? ? ? ? ? ? ? ?// 刪除第一個字符,迭代器end()用于刪除最后一個
    std::cout << str1 << std::endl;
    ?

    str1.erase(str1.begin(),str1.begin()+1); ? ? // 刪除迭代器范圍的字符[beg,end)
    std::cout << str1 << std::endl;

注意:? 還是和之前容器所說的一樣,使用erase結合循環刪除特定元素的時候,應該注意下一個迭代器的位置是erase()的返回值。(具體可以看之前容器部分)

11. string字符串的替換

  • ?std::string str1("Hello World");

    ?std::string str2("Good Good Study");
    ?

    ?str1.replace(1, 2, "123"); ? ? ? ? ? // 從下標為1的字符開始,共計兩個字節替換成"123"
    ?str1.replace(1, 2, str2);
    ?std::cout << str1 << std::endl;
    ?

    ?str1.replace(str1.begin(), ++str1.begin(), "你好"); ? ? ? // 將迭代器范圍[beg,end)內的字? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?符替換成"你好"
    str1.replace(str1.begin(), ++str1.begin(), str2);
    std::cout << str1 << std::endl;
    ?

    str1.replace(0, 2, str2, 0, 3); ? ? ? ? ? ?// 將str1從下標為0的字符開始,共計兩個字符替換? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?成str2從下標為0開始,共計3個字符的字符串
    std::cout << str1 << std::endl;
    ?

    str1.replace(3, 2, "Day Day Up", 2);
    std::cout << str1 << std::endl; ? ? ? ? ? ?// 將str1下標為3的字符開始,共計兩個字符替換成? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 后面字符串的前2個字符
    ?

    str1.replace(str1.begin(), ++str1.begin(), "我們", 2);
    std::cout << str1 << std::endl;

  • 返回值:? 其返回的就是替換之后的string對象

12. 使用assign()函數進行賦值?

使用方法和前面的方法是類似的,每次使用assign給字符串賦值的時候,都會覆蓋原來字符串的值。?

std::string str1;
std::string str2("ch");

str1.assign(5, 'a');? ? ? ? ? ? ? ?// aaaaa
str1.assign("123");? ? ? ? ? ? ?// 123
str1.assign("123",2); ? ? ? ? ?// 賦值字符串的前兩個字符? 12
str1.assign(str2);? ? ? ? ? ? ? ? // ch
str1.assign(str2,1);? ? ? ? ? ? ?// 使用str2下標為1的字符賦值str1? h

13. resize()重新設置字符串長度?

和容器中resize()的用法是類似的。

接收兩個參數,第一個參數是一個整數,表示長度變成多少
? ? ? ? ? ? ? ? ? ? ? ? ?第二個參數是一個字符,用于指定長度變長的時候填充的字符,默認以空格? ? ? ? ? ? ? ? ? ? ? ? ? ?填充?

我們通過第一個參數可以指定擴充或者縮短字符串的長度,第二個參數只有擴充長度的時候才有效。

?

std::string str1;
std::string str2("ch");
??
str1.resize(5,'a');
std::cout << str1 << std::endl;? ? // aaaaa

str2.resize(1);
std::cout << str2 << std::endl;? ?// c

?14. string類型轉換為其它類型

  • ?std::stoi();? ? 將字符串轉換為int類型
    ?std::stol();? ? 將字符串轉換為long類型
    ?std::stoll();? ?將字符串轉換為long long類型
  • std::stoul();? ?將字符串轉換為unsigned long類型
    std::stoull();? 將字符串轉換為unsigned long long類型
  • std::stof();? ? 將字符串轉換為float類型
    std::stod();? ?將字符串轉換為double類型
    std::stold();? 將字符串轉換為long double類型

例子:? 用法都類似
?

?? ?std::string str1("123");
?? ?std::cout << std::stoi(str1) << std::endl; ? ? // 123

?? ?std::string str2("123abc");
?? ?std::cout << std::stoi(str2) << std::endl; ? ? ?// 123

15. to_string()?

返回一個string類型,將別的類型轉換為字符串類型。

int a = 5;
std::string str = std::to_string(a);?

16.substr()字符串分割

只是簡單的字符串分割。如果要指定分割符分割的話,可以使用前面說的strtok()函數

std::string str("Hello World");

std::string ret = str.substr(0,5); ? ?// 從下標0開始分割5個字符
std::cout << ret << std::endl; ? ? ? ?// Hello
std::cout << str << std::endl; ? ? ? ?// Hello World

?

注意:? 關于string的操作其實都是以字節為準的?(可以跳過)

我們在上面的計算字符串長度,從指定位置查找字符或者子串,刪除指定位置的字符,刪除指定個數的字符,以及使用replace()替換指定位置的字符,這寫都是針對于字節來說的。

指不過上面的操作,都是以英文字符的形式去展示的,英文字符一個字符占用一個字節,所以上面我們都使用字符數表示了,其實不是這樣的,實際那些函數操作的是字節。

如果,在例子中使用中文字符(一個字符占兩個字節):?

1. 那么計算的長度就是字節數: 字符數*2

2. str1.erase(1);? ? ?// 對于中文字符會出現亂碼,因為此處的1表示,刪除字符串1字節之后的所有字節,中文字符一個占用兩個字節,如果你將1字節后面的字節都刪除了,表示中文字符的二進制就被截斷了,就會出現亂碼

str.erase(2);? ? // 這樣表示刪除字符串2字節之后的所有字符,對于中文字符,這樣才是真正的保留下第一個字符。

3. 對于迭代器也是同理,begin()和end()都是表示一個字節。


4. str1.replace(0, 2, str2, 0, 3);? ? //? 這個取代語句,是將str1第一個位置開始兩個字節的元素替換成str2第一個位置開始三個字節的元素。
如果我們操作的是中文,那么替換的字節數必須是2的倍數,否則就會出現亂碼。

等等,相關的操作其實都是對于字節數的操作。其實這些你不知道也無所謂,只是如果你去嘗試操作放有中文的或者其它多字節字符的字符串的時候,可能會感到蒙。

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

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

相關文章

PingCAP 戴濤:構建面向未來的金融核心系統

作者&#xff1a;戴濤 導讀 近日&#xff0c;平凱星辰解決方案技術部總經理戴濤在 2024 數據技術嘉年華活動中&#xff0c;做了主題為“構建面向未來的金融核心系統”的分享&#xff0c;本文為戴濤演講實錄的全文。 文章分析了中國金融行業的發展趨勢&#xff0c;并且基于這…

在 Mac OS 上使用 Homebrew 打造便捷的軟件安裝體驗:apt-get install 就是brew install:

標題&#xff1a;在 Mac OS 上使用 Homebrew 打造便捷的軟件安裝體驗 在 Mac OS 系統中&#xff0c;雖然不支持 apt-get install&#xff0c;但我們有幸擁有 Homebrew 這樣出色的包管理器。它為我們在 Mac 上安裝各種所需軟件提供了極大的便利。 一、安裝 Homebrew 要安裝 Home…

算法提高之加成序列

算法提高之加成序列 核心思想&#xff1a;迭代加深 dfs 從上往下逐漸增大depth 這樣下面沒有用的方案就不用遍歷了 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110;int n;int path[N];//當前求哪個位置…

PDF編輯閱讀器PDF Expert for Mac v3.10.1中文激活版

PDF Expert for Mac是一款易于使用的 PDF 編輯器和注釋器&#xff0c;專為 Mac 設備設計。它允許用戶輕松查看、編輯、簽名、注釋和共享 PDF。該軟件使用戶能夠向他們的 PDF 添加文本、圖像、鏈接和形狀&#xff0c;突出顯示和標記文本&#xff0c;填寫表格以及簽署數字文檔。它…

STL----resize

resize的作用 設置容器元素個數和初始值。 resize和reserve resize即改變容器元素個數&#xff0c;也改變容器容量。 reserve只改變容器容量&#xff0c;不改變容器元素個數。 reserve有什么用 reserve---存儲&#xff0c;容量&#xff0c;保留。 1&#xff0c;設置容器容…

Python實現麥克風錄音保存到wav

功能展示&#xff1a; 運行環境&#xff1a; Python: 3.10.4 64-bit 操作系統&#xff1a; 截圖環境&#xff1a;win10 64-bit 視頻錄屏環境&#xff1a;win10 64-bit 功能說明&#xff1a; 點擊界面開始按鈕開始錄音&#xff0c;點擊停止按鈕結束錄音。 源碼文件列表&…

十二生肖Midjourney繪畫大挑戰:釋放你的創意火花

隨著AI藝術逐漸進入大眾視野&#xff0c;使用Midjourney繪制十二生肖不僅能夠激發我們的想象力&#xff0c;還能讓我們與傳統文化進行一場新式的對話。在這里&#xff0c;我們會逐一提供給你創意滿滿的繪畫提示詞&#xff0c;讓你的作品別具一格。而且&#xff0c;我們還精選了…

掃碼槍與Input的火花

文章目錄 前言一、需求&#xff1a;交互細節二、具體實現兩個核心的函數&#xff1a;自動聚焦 三&#xff0c;擴展知識input 與 change的區別 前言 在瀏覽器掃描條形碼獲取條形的值&#xff0c;再操作對應的邏輯。這是比較常見的業務&#xff0c;這里記錄實際操作。 其中PC端…

2023年國賽高教杯數學建模C題蔬菜類商品的自動定價與補貨決策解題全過程文檔及程序

2023年國賽高教杯數學建模 C題 蔬菜類商品的自動定價與補貨決策 原題再現 在生鮮商超中&#xff0c;一般蔬菜類商品的保鮮期都比較短&#xff0c;且品相隨銷售時間的增加而變差&#xff0c;大部分品種如當日未售出&#xff0c;隔日就無法再售。因此&#xff0c;商超通常會根據…

JSON 轉為json串后出現 “$ref“

問題描述 轉為JSON 串時出現 "$ref":"$.RequestParam.list[0]" $ref&#xff1a; fastjson數據重復的部分會用引用代替&#xff0c;當一個對象包含另一個對象時&#xff0c;fastjson就會把該對象解析成引用 “$ref”:”..” 上一級 “$ref”:”” 當前對…

2、架構-服務間的通信

遠程服務將計算機程序的工作范圍從單機擴展至網絡&#xff0c;從本地延 伸至遠程&#xff0c;是構建分布式系統的首要基礎。而遠程服務又不僅僅是為 分布式系統服務的&#xff0c;在網絡時代&#xff0c;瀏覽器、移動設備、桌面應用和服 務端的程序&#xff0c;普遍都有與其他設…

分布式搜索-elaticsearch基礎 安裝es

這里是在虛擬機的Linux系統里安裝es的教程: 1.創建網絡 在Finashell終端輸入指令 docker network create es-net 2.將es.tar安裝包放入tmp的目錄下 輸入指令加載鏡像&#xff1a;docker load -i es.tar 3.再運行docker 命令 docker run -d \--name es \-e "ES_JAVA_O…

UE4_照亮環境_光束light beam

學習筆記&#xff0c;不喜勿噴&#xff0c;侵權立刪&#xff01;祝愿生活越來越好&#xff01; 光束&#xff1a;模擬大氣中散射的光線。利用定向光源模擬真實曙暮光效果或大氣散射的陰影&#xff0c;即可生成 光束 。這些光線為場景添加深度和真實度。 一&#xff1a;一些參數…

RabbitMQ部署指南.md

RabbitMQ部署指南 1.單機部署 我們在Centos7虛擬機中使用Docker來安裝。 1.1.下載鏡像 方式一&#xff1a;在線拉取 docker pull rabbitmq:3.8-management方式二&#xff1a;從本地加載 在課前資料已經提供了鏡像包&#xff1a; 上傳到虛擬機中后&#xff0c;使用命令加載…

ASP.NET銀行大廳自助信息系統的開發與實現

摘 要 本畢業設計在基于銀行業務大廳現有業務的基礎上&#xff0c;針對自助銀行的概念和其獨有特點&#xff0c;通過.NETSQL技術&#xff0c;開發一個簡單的銀行大廳自助信息系統&#xff0c;完成一些自助銀行的業務需求如帳戶信息查詢、帳戶掛失、自助交費、留言、新聞查詢…

jmeter中java請求,解決不支持協議和元件,實現自定義元件

目錄 java請求 作用場景 JavaTest類源碼分析 編寫java請求樣例 新建java工程&#xff0c;導入jmeter主要依賴。 編寫java請求類&#xff0c;繼承AbstractJavaSamplerClient, 導入工程為jar包&#xff0c;放置jmeter安裝目錄下lib/ext目錄 重啟jmeter&#xff0c;添加ja…

3D,點云下采樣

文章目錄 一、隨機采樣1、算法原理2、步驟二、格點采樣格點采樣的特點三、均勻采樣1、類似體素網格采樣2、固定間隔采樣3、最遠點采樣四、曲率采樣曲率采樣的特點:參考資料:對于大規模點云處理而言,直接對點云進行特征提取能較好地保留三維結構信息。但由于點云的無序性,直…

flutter開發實戰-log日志存儲zip上傳,發送釘釘機器人消息

flutter開發實戰-log日志存儲zip上傳&#xff0c;發送釘釘機器人消息 當我們需要Apk上傳的時候&#xff0c;我們需要將日志打包并上傳到七牛&#xff0c;上傳之后通過釘釘通知我們日志下載地址。 這里我使用的是loggy來處理日志 一、引入loggy日志格式插件 在工程的pubspec.…

【經驗總結】超算互聯網服務器 transformers 加載本地模型

1. 背景 使用 超算互聯網 的云服務&#xff0c;不能連接外網&#xff0c;只能把模型下載到本地&#xff0c;再上傳上去到云服務。 2. 模型下載 在 模型中 https://huggingface.co/models 找到所需的模型后 點擊下載 config.json pytorch_model.bin vocab.txt 3. 上傳模型文…

Flutter 中的 CupertinoAlertDialog 小部件:全面指南

Flutter 中的 CupertinoAlertDialog 小部件&#xff1a;全面指南 在Flutter中&#xff0c;CupertinoAlertDialog是用于在iOS風格的應用中顯示警告或提示信息的模態對話框。它以其圓角卡片和模糊背景為特點&#xff0c;為用戶提供了一個簡潔而直觀的交互界面。CupertinoAlertDi…