STL庫--string

目錄

string的定義

string中內存的訪問

string常用函數實例解析

string的定義

定義string的方式跟基本類型相同,只需要在string后跟上變量名即可:

string str;

如果要初始化,可以直接給string類型的變量進行賦值:

string str="abcd";

string中內存的訪問

(1)通過下標訪問

一般來說,可以直接像字符數組那樣來訪問string:

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";for(int i=0;i<str.length();i++){printf("%c",str[i]);}return 0;
}

如果要讀入和輸出整個字符串,則只能用cin和cout

#include<iostream>
#include<string>
using namespace std;
int main(){string str;cin>>str;cout<<str;return 0;
}

上面的代碼對任意的字符串輸入,都會輸出同樣的字符串。

那么,其實也可以使用printf來輸出string,即用c_str()將string類型轉換為字符數組進行輸出。

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";printf("%s\n",str.c_str());return 0;
}

(2)通過迭代器訪問

一般僅通過(1)即可滿足訪問的要求,但是有些函數比如insert()與erase()則要求以迭代器為參考。

由于string不像其它STL容器那樣需要參數,因此可以直接如下定義:

string::iterator it;

這樣就得到了迭代器it,并且可以通過*it來訪問string里的每一位:

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";for(string::iterator it=str.begin();it!=str.end();it++){printf("%c",*it);}return 0;
}

最后指出,string和vector一樣,支持直接對迭代器進行加減某個數字,如str.begin()+3的寫法是可行的。

string常用函數實例解析

(1)operator+=

這是string的加法,可以將兩個string直接拼接起來

#include<iostream>
#include<string>
using namespace std;
int main(){string str1="abc",str2="xyz",str3;str3=str1+str2;//將str1和str2拼接起來,賦值給str3str1+=str2;//將str2直接拼接到str1上cout<<str1<<endl;cout<<str3<<endl;return 0; 
}

(2)compare operator

兩個string類型可以直接使用==、!=、<、<=、>、>=比較大小,比較規則是字典序。

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str1="aa",str2="aaa",str3="abc",str4="xyz";if(str1<str2){printf("ok1\n");}if(str1!=str3){printf("ok2\n");}if(str4>=str3){printf("ok3\n");}return 0;
}

(3)length()/size()

length()返回string的長度,即存放的字符數,時間復雜度為O\left ( 1 \right )。size()與length()基本相同。

string str="abcxyz";
printf("%d %d\n",str.length(),str.size());

(4)insert()

string的insert()函數有很多種寫法,這里給出幾個常用的寫法,時間復雜度為O\left ( N \right )

1.insert(pos,string),在pos號位置插入字符串string

string str="abcxyz",str2="opq";
str.insert(3,str2);

輸出結果

abcopqxyz

2.insert(it,it2,it3)

it為原字符串的欲插入位置,it2和it3為待插字符串的首尾迭代器,用來表示串[it2,it3)將被插在it的位置上。

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcxyz",str2="opq";//在str的3號位(即c和x之間)插入str2 str.insert(str.begin()+3,str2.begin(),str2.end());cout<<str<<endl;return 0;
}

(5)erase()

erase()有兩種用法:刪除單個元素,刪除一個區間內的所有元素,時間復雜度均為O\left ( N \right )

1.刪除單個元素

str.erase()用于刪除單個元素,it為需要刪除的元素的迭代器

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(str.begin()+4);cout<<str<<endl;return 0;
} 

輸出結果

abcdfg

2.刪除一個區間內的所有元素

刪除一個區間內的所以元素有兩種方法:

str.erase(first,last),其中first為需要刪除的區間的起始迭代器,而last則為需要刪除的區間的末尾迭代器的下一個地址,也即為刪除[first,last)

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(str.begin()+2,str.end()-1);cout<<str<<endl;return 0;
}

輸出結果?

abg

str.erase(pos,length),其中pos為需要開始刪除的起始位置,length為刪除的字符個數。

#include<iostream>
#include<string>
using namespace std;
int main(){string str="abcdefg";str.erase(3,2);cout<<str<<endl;return 0;
}

輸出結果

abcfg

(6)clear()?

clear()用以清空string中的數據,時間復雜度一般為O\left ( 1 \right )

#include<stdio.h>
#include<string>
using namespace std;
int main(){string str="abcd";str.clear();printf("%d\n",str.length());return 0;
}

(7)substr()

substr(pos,len)返回從pos號位開始,長度為len的子串,時間復雜度為O\left ( len \right )

#include<iostream>
#include<string>
using namespace std;
int main(){string str="Thank you for your smile.";cout<<str.substr(0,5)<<endl;cout<<str.substr(14,4)<<endl;cout<<str.substr(19,5)<<endl;return 0;
} 

輸出結果

Thank
your
smile

(8)string::npos

string::npos是一個常數,其本身的值為-1,但由于是unsigned_int類型,因此實際上也可以認為是unsigned_int類型的最大值。string::npos用以作為find函數失配時的返回值。例如在下面的實例中可以認為string::npos等于-1或者4294967295.

#include<iostream>
#include<string>
using namespace std;
int main(){if(string::npos==-1){cout<<"-1 is true."<<endl;}if(string::npos==4294967295){cout<<"4294967295 is also true."<<endl;}return 0;
}

輸出結果

-1 is true.
4294967295 is also true.

(9)find()

str.find(str2),當str2是str的子串時,返回其在str中第一次出現的位置;如果str2不是str的子串,那么返回string::npos

str.find(str2,pos),從str的pos號位開始匹配str2,返回值與上相同。

時間復雜度為O\left ( nm \right ),其中n和m分別是str和str2的長度。

#include<iostream>
#include<string>
using namespace std;
int main(){string str="Thank you for your smile.";string str2="you";string str3="me";if(str.find(str2)!=string::npos){cout<<str.find(str2)<<endl;}if(str.find(str2,7)!=string::npos){cout<<str.find(str2,7)<<endl;}if(str.find(str3)!=string::npos){cout<<str.find(str3)<<endl;}else{cout<<"I know there is no position for me."<<endl;}return 0;
}

輸出結果

6
14
I know there is no position for me.

(10)replace()

str.replace(pos,len,str2)把str從pos號位開始,長度為len的子串替換為str2

str.replace(it1,it2,str2)把str的迭代器[it1,it2)范圍的子串替換為str2

#include<iostream>
#include<string>
using namespace std;
int main(){string str="Maybe you will turn around.";string str2="will not";string str3="surely";cout<<str.replace(10,4,str2)<<endl;cout<<str.replace(str.begin(),str.begin()+5,str3)<<endl;return 0;
}

輸出結果

Maybe you will not turn around.
surely you will not turn around.

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

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

相關文章

Vue3+vite項目中使用mock模擬接口

安裝依賴 分別安裝vite-plugin-mock跟mockjs兩個插件 npm install -D vite-plugin-mock mockjs vite.config.ts中添加配置&#xff0c;主要是紅色標記的配置 注意此處如果配置出錯可能是vite-plugin-mock依賴的版本有問題&#xff0c;重新安裝一下依賴指定版本即可&#xf…

Pytorch環境配置2.0.1+ Cuda11.7

查找cuda、cudnn、Pytorch(GPU)及cuda和NVIDIA顯卡驅動對應關系 查詢可支持的最高cuda版本 nvidia-smi查看支持的cuda的版本 CUDA版本對應表 我的顯卡驅動是Driver Version&#xff1a;535.40.&#xff0c;那么左邊對應的CUDA都可以兼容 右上角為CUDA 版本&#xff0c;可以看…

Ubuntu配置Git

安裝git sudo apt install git 查看是否安裝成功 git --version 配置git 用github上注冊的用戶名和郵箱地址&#xff0c;配置git git config --global user.name "username" git config --global user.email "usernameemail.com" 重啟ubuntu查看…

Collection(一)[集合體系]

說明&#xff1a;Collection代表單列集合&#xff0c;每個元素&#xff08;數據&#xff09;只包含一個值。 Collection集合體系&#xff1a; Collection<E> 接口 (一&#xff09;List<E> 接口 說明&#xff1a;添加的元素是有序、可重復、有索引。 1. ArrayLi…

vue3中的toRaw API

文章目錄 什么是toRaw API&#xff1f;為什么需要toRaw&#xff1f;如何使用toRaw&#xff1f;實際應用場景 這兩天在寫項目的時候&#xff0c;發現了一個之前沒用過的api&#xff0c;于是上網查了一下&#xff0c;發現這個api還是挺常用&#xff0c;所以在這記錄一下 什么是t…

Pytorch實用教程:多分類任務中使用的交叉熵損失函數nn.CrossEntropyLoss

nn.CrossEntropyLoss 在 PyTorch 中是處理多分類問題的常用損失函數,它是兩個函數 nn.LogSoftmax 和 nn.NLLLoss(Negative Log Likelihood Loss)的組合。使用這個損失函數可以直接從模型得到原始的輸出分數(logits),而不需要單獨對輸出進行 Softmax 處理。下面詳細介紹這…

【Postman接口測試】第二節.Postman界面功能介紹(上)

文章目錄 前言一、Postman前言介紹二、Postman界面導航說明三、使用Postman發送第一個請求四、Postman 基礎功能介紹 4.1 常見類型的接口請求 4.1.1 查詢參數的接口請求 4.1.2 表單類型的接口請求 4.1.3 上傳文件的表單請求 4.1.4 JSON 類…

HCIP-Datacom-ARST自選題庫__BGP/MPLS IP VPN簡答【3道題】

1.在BGP/MPLSIPVPN場景中&#xff0c;如果PE設備收到到達同一目的網絡的多條路由時&#xff0c;將按照定的順序選擇最優路由。請將以下內容按照比較順序進行排序。 2.在如圖所示的BGP/MPLSIP VPN網絡中&#xff0c;管理員準備通過Hub-Spoke組網實現H站點對VPM流量的集中管控&am…

C# 配置文件設置詳解

文章目錄 1. 配置文件在 C# 項目中的作用和重要性2. 不同類型的配置文件app.configconfig.exejson 3. 創建和修改配置文件文件位置添加內容修改內容保存和加載 4. 讀取和寫入配置文件app.config 文件讀取config.exe 文件寫入JSON 文件讀寫 5. 示例代碼演示6. 配置文件在安全性方…

【kubernetes】關于k8s集群的污點、容忍、驅逐以及k8s集群故障排查思路

目錄 一、污點(Taint) 1.1污點介紹 1.2污點的組成格式 1.3當前 taint effect 支持如下三個選項&#xff1a; 1.4污點的增刪改查 1.4.1驗證污點的作用——NoExecute 1.4.2驗證污點的作用——NoSchedule 1.4.3 驗證污點的作用——PreferNoSchedule 1.5污點的配置與管理…

防刷發送短信驗證碼接口的五種簡單好用方法絕對夠用

防刷發送短信驗證碼接口的五種簡單好用方法&#xff0c;絕對夠用 前端增加圖形驗證碼&#xff0c;點擊發送按鈕后增加60s倒計時&#xff0c;60s后才可以再次點擊 后端對接口次數校驗&#xff0c;60s內同一電話號碼只能發送一次 // 生成基于電話號碼的重試鎖定鍵 String repeat…

MATLAB增強型鯨魚優化改進算法代碼復現實例

MATLAB增強型鯨魚優化改進算法代碼復現實例 MATLAB增強型鯨魚優化改進算法代碼復現實例

php反序列化學習(1)

1、php面向對象基本概念 類的定義&#xff1a; 類是定義了一件事物的抽象特征&#xff0c;它將數據的形式以及這些數據上的操作封裝住在一起。&#xff08;對象是具有類類型的變量&#xff0c;是對類的實例&#xff09; 構成&#xff1a; 成員變量&#xff08;屬性&#xf…

基于開源項目HAL STM32F4 +DSP庫跑SVPWM開環速度測試

HAL STM32F4 ARM DSP庫跑SVPWM開環速度測試 ?本篇硬件電路和代碼來源于此開源項目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件電路和項目介紹&#xff0c;立創開源廣場&#xff1a;https://oshwhub.com/shadow27/tai-yang-neng-wu-re…

走進智慧倉儲:3D可視化工廠園區革新物流新紀元

在快節奏的現代生活中&#xff0c;物流倉儲行業扮演著至關重要的角色。隨著科技的飛速發展&#xff0c;傳統倉儲模式正面臨一場前所未有的變革。今天&#xff0c;就讓我們一起看看3D可視化技術如何為物流行業帶來前所未有的便利與效率。 什么是3D可視化工廠園區&#xff1f; 3…

2024華為OD機試真題-最長子字符串的長度(一)-C++-OD統一考試(C卷D卷)

題目描述 給你一個字符串 s&#xff0c;首尾相連成一個環形&#xff0c;請你在環中找出 o 字符出現了偶數次最長子字符串的長度。 輸入描述 輸入是一個小寫字母組成的字符串 輸出描述 輸出是一個整數 備注 1 ≤ s.length ≤ 500000 s 只包含小寫英文字母 用例1 輸入 alol…

vim常用指令——001

vim常用指令 Vim的命令模式常用操作一、定位移動光標二、行的基本操作【復制、粘貼、刪除】三、查找、替換四、分屏命令 總結給大家總結下四個運行模式&#xff1a; Vim的命令模式常用操作 一、定位移動光標 按h&#xff1a;將光標向左移動一個字符&#xff0c;等同于方向鍵左…

UI學習筆記(二)—— 深入了解導航控制

「OC」UI學習筆記&#xff08;二&#xff09; 文章目錄 「OC」UI學習筆記&#xff08;二&#xff09;手動布局子視圖自動布局子視圖導航控制器高級使用 手動布局子視圖 //父視圖的.h文件 #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGINinterface JCSuperView : UIVie…

【最新區塊鏈論文錄用資訊】CCF A—INFOCOM 2024 共17篇

Conference&#xff1a;IEEE International Conference on Computer Communications CCF level&#xff1a;CCF A Categories&#xff1a;計算機網絡 Year&#xff1a;2024 Num&#xff1a;17 A Generic Blockchain-based Steganography Framework with High Capacity via …

Python: 使用pyotp實現OTP一次性密碼驗證

使用pyotp實現OTP一次性密碼驗證 OTP的基本原理 生成一個共享秘鑰作為隨機數的種子服務端通過種子計算出當前的密碼客戶端也通過相同的種子計算出當前的密碼驗證客戶端生成的密碼和服務端生成的密碼是否匹配 服務端和客戶端計算的方式一樣 共享密鑰 時間因子 算法 > 密…