string【基礎篇】

1.1string字符串類

注意:這個類獨立于所使用的編碼來處理字節:如果用來處理多字節或變長字符(如UTF-8)的序列,這個

類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(而不是實際編碼的字符)來操作。

總結:

  1. string是表示字符串的字符串類
  2. 該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。
  3. string在底層實際是:basic_string模板類的別名,typedef basic_string<typedef basic_string<char, char_traits, allocator>?string;
  4. ?不能操作多字節或者變長字符的序列。

在使用string類時,必須包含#include頭文件以及using namespace std;

1.2string接口(函數)

1.string類對象的常見構造

string()

構造空的string類對象,即空字符串

string(const char* s)

用C-string來構造string類對象

string(size_t n, char c)

string類對象中包含n個字符c

string(const string&s)

拷貝構造函數

void Teststring()
{string s1; // 構造空的string類對象s1string s2("hello bit"); // 用C格式字符串構造string類對象s2string s3(s2); // 拷貝構造s3
}

2.容量操作

函數名稱

功能說明

size(重點)

返回字符串有效字符長度

length

返回字符串有效字符長度

capacity

返回空間總大小

empty

檢測字符串釋放為空串,是返回true,否則返回false

clear

清空有效字符(不清理空間【縮容】)

reserve

為字符串預留空間【擴容】(比capacity大擴容)

resize

將有效字符的個數改成n個,多出的空間用字符空白符填充【可擴可縮】

reserse

將容器范圍內的元素顛倒順序放置

shrink_to_fit

縮容(不會為0)

STL擴容機制(在不同編譯器有所不同)

int asz=capacity();

注意:下圖表示的是reserve與resize的不同

容量原本是10個空間大小,隨后我們要求reserve(100)預留了100空間大小,然后使用resize(5),使得元素個數只有5個,其空間容量并不改變。

其可以說明resize不能改變容量的大小。

注意:

  1. size()與length()方法底層實現原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。
  2. clear()只是將string中有效字符清空,不改變底層空間大小。
  3. resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數改變到n個【擴容/縮小】
  • 不同的是當字符個數增多時:resize(n)用\0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的元素空間。
  • 注意:resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變。
  1. ?reserve(size_t res_arg=0):為string預留空間,不改變有效元素個數,當reserve的參數小于string的底層空間總大小時,reserver不會改變容量大小。

3.遍歷法門

字符串的遍歷主要分為三種:引用( [ ] ),迭代器(最實用),訪問for

operator[ ]?

返回pos位置的字符,const string類對象調用

begin+ end (從前向后)

begin獲取前一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器(可看作'\0'的位置)

rbegin +rend(從后向前)

rbegin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器(反省迭代器)

范圍for

C++11支持更簡潔的范圍for的新遍歷方式

迭代器遍歷:?

4.修改操作

push_back?

在字符串后尾插字符c

append

在字符串后追加一個字符串

operator+= (重點)

在字符串后追加字符串str

assign

覆蓋原內容(多出補空白符)

inset

添加/截取內容(從pos開始的len個)“位置”

有挪動數據

erase

刪除內容(從pos開始的len個)有挪動數據

replace

替換內容(從pos開始的len個)有挪動數據

c_str(重點)

返回C格式字符串

?nd?+ npos(重點)

從字符串pos位置開始往后找字符c,返回該字符在字符串中的位置

r?nd

從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置

substr

在str中從pos位置開始,截取n個字符,然后將其返回

注意:

  1. 在string尾部追加字符時,s.push_back(c) / s.append(1, c) / s += 'c'三種的實現方式差不多,一般情況下string類的+=操作用的比較多,+=操作不僅可以連接單個字符,還可以連接字符串。
  2. ?對string操作時,如果能夠大概預估到放多少字符,可以先通過reserve把空間預留好。

5.string類非成員函數

operator+

盡量少用,因為傳值返回,導致深拷貝效率低

operator>> (重點)

輸入運算符重載

operator (重點)

輸出運算符重載

getline (重點)

獲取一行字符串

relational operators (重點)

大小比較

?注意:string使用cin>>str輸入時遇到空格之會保存空格之前的

擴展:

find_first_of 查找一個字符串中出現某一字符的位置并返回

例子:

int size_pos=strText.find_first_of(strSeparator(查找字符), size_pos())

find_last_of 查找一個字符串中出現某一字符最后出現的位置并返回 int size_pos=strText.find_last_of(strSeparator(查找字符), size_pos()))

substr 截取字符串中的“內容“

例子:string strResult = strText.substr(size_prev_pos(頭), size_pos-size_prev_po(尾));?

1.3. 牛刀小試

了解了這么多的接口,試著用一兩的寫寫下面的題,理解理解用法、注意事項。

1.僅僅反轉字母

?僅僅反轉字母?

class Solution {
public:bool isLetter(char ch){if(ch >= 'a' && ch <= 'z') return true; if(ch >= 'A' && ch <= 'Z') return true;return false;}string reverseOnlyLetters(string S) { if(S.empty()) return S;size_t begin = 0, end = S.size()-1; while(begin < end){while(begin < end && !isLetter(S[begin]))++begin;while(begin < end && !isLetter(S[end]))--end;swap(S[begin], S[end]);++begin;--end;}return S;}
};

2.找字符串中第一個只出現一次的字符

找字符串中第一個中出現一次的字符

class Solution {
public:int firstUniqChar(string s) {// 統計每個字符出現的次數 int count[256] = {0};int size = s.size(); for(int i = 0; i < size; ++i) count[s[i]] += 1; // 按照字符次序從前往后找只出現一次的字符 for(int i = 0; i < size; ++i) if(1 == count[s[i]]) return i; return -1;}
};

3.字符串里面最后一個單詞的長度

符串里面最后一個單詞的長度?

#include<iostream>
#include<string>
using namespace std;
int main()
{string line;// 不要使用cin>>line,因為會它遇到空格就結束了 // while(cin>>line)while(getline(cin, line)){size_t pos = line.rfind(' '); cout<<line.size()-pos-1<<endl; } return 0;
}

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

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

相關文章

設計模式系列文章-7個創建型模式更新已完結

其實從2019年開始就有些一套關于設計模式的系列文章&#xff0c;但是因為種種原因一直擱置到現在。直到2024年才又恢復更新。 24年1月份上旬一直在弄博客站&#xff1a;https://jaune162.blog 的搭建 24年1月份下旬弄專題站&#xff1a;https://books.jaune162.blog 的搭建。…

「優選算法刷題」:二進制求和

一、題目 給你兩個二進制字符串 a 和 b &#xff0c;以二進制字符串的形式返回它們的和。 示例 1&#xff1a; 輸入:a "11", b "1" 輸出&#xff1a;"100" 示例 2&#xff1a; 輸入&#xff1a;a "1010", b "1011" …

Qt應用軟件【測試篇】vargrid內存檢查工具

文章目錄 vargrid介紹vargrid官網vargrid安裝常用命令Valgrind的主要命令vargrid介紹 Valgrind是一個用于構建動態分析工具的框架,能自動檢測許多內存管理和線程錯誤,并詳細分析程序性能。Valgrind發行版包括七個成熟工具:內存錯誤檢測器、兩個線程錯誤檢測器、緩存和分支預…

Java8 - LocalDateTime時間日期類使用詳解

&#x1f3f7;?個人主頁&#xff1a;牽著貓散步的鼠鼠 &#x1f3f7;?系列專欄&#xff1a;Java全棧-專欄 &#x1f3f7;?個人學習筆記&#xff0c;若有缺誤&#xff0c;歡迎評論區指正 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&…

redis+定時 模擬滑動窗口實現熔斷降級

業務背景 公司業務現用的通道為 A、B&#xff0c;為了降本&#xff0c;引入新的支付通道 Y&#xff0c;但 Y 通道的穩定性要低于 A、B&#xff0c;系統要能在 Y 通道故障時自動切回到 A、B&#xff0c;等 Y 恢復正常后&#xff0c;再切換到 Y。 乍一看很簡單&#xff0c;不就是…

使用鏈表和數組輸出A~Z的ASCII碼

輸出結果 26個字母以及其對應的ASCII碼 一、使用鏈表創建&#xff0c;注意&#xff1a; 節點需要有next指針初始化時head需要new一下 cur指針代表當前指針&#xff0c;每次不斷的New新的節點&#xff0c;pre指針代表當前指針的前一個指針&#xff0c;每次pre的next指針指向cur…

sql注入攻擊 - cookie注入

環境準備:構建完善的安全滲透測試環境:推薦工具、資源和下載鏈接_滲透測試靶機下載-CSDN博客 一、Cookie 知識介紹 Cookie(HTTP Cookie)是服務器發送到用戶瀏覽器并保存在本地的一小段數據,用于記錄用戶的相關信息和狀態。這些信息通常包括用戶的身份標識、網站偏好設置…

3.1日學習打卡----初學FastDFS(一)

3.1日學習打卡 目錄: 3.1日學習打卡一. 為什么要使用分布式文件系統二. FastDFS簡介核心概念上傳機制下載機制FastDFS環境搭建_LinuxFastDFS指令 一. 為什么要使用分布式文件系統 單機時代 初創時期由于時間緊迫&#xff0c;在各種資源有限的情況下&#xff0c;通常就直接在項…

二分+質因數分解,LightOJ 1138Trailing Zeroes (III)

一、題目 1、題目描述 You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! 1 * 2 * ... * N. For example, 5! 120, 120 contains one zero on the trail. 2、輸入輸出 2.1輸入 Input…

HTML---Ajax

文章目錄 目錄 文章目錄 前言 一.Ajax概述 二.原生創建Ajax 三,使用Jquery處理Ajax 總結 一.Ajax概述 AJAX&#xff08;Asynchronous Javascript And XML&#xff09;是一種創建交互式網頁應用的網頁開發技術。它使用Javascript語言與服務器進行異步交互&#xff0c;可以傳…

【計算機網絡】五種IO模型與IO多路轉接之select

文章目錄 一、五種IO模型二、非阻塞IO1.fcntl2.實現函數SetNoBlock3.輪詢方式讀取標準輸入 三、I/O多路轉接之select1.初識select2.select函數原型3.socket就緒條件4.select的特點5.select缺點6.select使用案例--只讀取數據的server服務器1.err.hpp2.log.hpp3.sock.hpp4.select…

DBGridEh 的排序

DBGridEh 可以點列抬頭使得記錄按該列排序 不需要寫代碼&#xff0c;只需要設置好&#xff0c;它就能排序。 網上的文章一般寫了如何設置。但一般都少說了一條。 先說如何設置&#xff1a; 1. OptionsEh.AutoSortMarking 設置為 True&#xff0c;如果是設計期屬性面板&…

Linux上搭建并使用ffmpeg(Java)

關于MacOs和Windows系統上使用ffmpeg就不多說了&#xff0c;有很多相關文章&#xff0c;今天給大家分享一個在Linux環境下使用Java語言來使用ffmpeg 一、首先去官網下載一個Linux對應的ffmpeg包 1、進入ffmpeg官網&#xff1a;官網 2、點擊左側導航欄Download 3、選擇Linux對…

如何利用graylog進行容器化日志管理?

Docker日志 當一個容器啟動的時候&#xff0c;它其實是docker deamon的一個子進程&#xff0c;docker daemon可以拿到容器里面進程的標準輸出&#xff0c;然后通過自身的LogDriver模塊來處理&#xff0c;LogDriver支持的方式很多&#xff0c;默認寫到本地文件&#xff0c;也可…

vue自定義實現icon選擇器

<template> <div> <span class"iconStyle" click"selectIcon"> <i :class"value" /> </span> <div class"iconTitle">選擇圖標</div> <el-dialog title"" :visible.sync"…

springboot + nacos + aws secretmanager 做賬號密碼隱私處理

方式一&#xff1a; #nacos配置文件data.yml: spring:cloud:nacos:discovery:ip: ****.comport: 80datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://*********/database?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&fail…

java 商機管理系統Myeclipse開發mysql數據庫web結構jsp編程計算機網頁項目

一、源碼特點 java 商機管理系統是一套完善的java web信息管理系統&#xff0c;對理解JSP java編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采用B/S模式開發。開發環境為 TOMCAT7.0,Myeclipse8.5開發&#xff0c;數據庫為Mysql5.0&…

LeetCode142. 環形鏈表 II刷題詳解

今天力扣刷到了一個特別有意思的題目&#xff0c;于是就寫了下面的題解來加深以下理解。 142. 環形鏈表 II - 力扣&#xff08;LeetCode&#xff09; 這個可以分為兩大步去寫&#xff0c;首先要判斷鏈表是否有環&#xff0c;然后如果有環就去找到環的入口&#xff0c;沒有環返…

python3.x的在線與離線安裝純凈版

由于計劃搭建一套使用python自動分析日志的流程&#xff0c;發現我們的測試環境CentOS 7仍然沒有安裝python3&#xff0c;無法使用這些新的庫。Python 3在設計上著重提升了語言的一致性和易用性&#xff0c;它引入了許多關鍵改進&#xff0c;此外&#xff0c;Python 3環境擁有豐…

基于springboot+html實現的衣物捐贈平臺

一、系統架構 前端&#xff1a;html | layui | jquery | css 后端&#xff1a;springboot | thymeleaf | mybatis 環境&#xff1a;jdk1.8 | mysql | maven 二、代碼及數據庫 三、功能介紹 01. 登錄頁 02. 注冊 03. web頁-首頁 04. web頁-捐贈衣服 05. web頁-論壇交流…