C++_STL---string類

前言

說起string類,首先需要了解的是 - string類是什么?

std::string是類模板std::basic_string的一個元素類型為char的實例化,而basic_string則是對元素指針的封裝。由于basic_string的實現對字符串操作進行了優化,所以它不能用來表示除char以外的對象串。但是使用string類也避免了和'\0'的糾纏不休,也就是說,string并不關心它所代表的字符串有無'\0'作為字符串的結束標志,相反'\0'是它的一個合法元素。

string類的接口與常規容器的接口基本相同,但在此基礎上也添加了一些專門用來操作string的常規接口。在使用string類時,必須包含#include頭文件以及using namespace std;另外,想要更加深入的了解string類,請點擊string類的文檔介紹~~

string類的常用接口

因為string類的接口特別多(106個接口函數),所以這里只介紹幾個常用且重要的接口。

1.string類對象的常見構造

函數說明功能說明代碼演示
string()構造空的string類對象,即空字符串string s1;
string(const char* str)用C-string來構造string類對象string s2("hello");
string(const char& str)拷貝構造函數string s3(s2);

2.string類對象的容量操作

函數名稱功能說明函數原型
reserve為字符串預留空間void reserve(size_t n = 0);
resize將有效字符個數改成n個,多出的空間用char c填充

void resize(size_t n);

void resize(size_t n, char c);

clear清空有效字符void clear();

特別說明:

  • 使用reserve擴容時,只會影響capacity,并不會影響size;默認不會縮容
  • 使用resize擴容,不僅會影響capacity,也會影響size,并且會將開出的空間初始化為'\0'(不顯示寫char c的時候);縮容的時候只會影響size

3. string類對象的訪問及遍歷操作

函數名稱功能說明函數原型
operator[]返回pos位置的字符char& operator[] (size_t pos);
begin + end

begin獲取一個字符的迭代器?

end獲取最后一個字符下一個位置的迭代器

iterator begin();

iterator end();

4. string類對象的修改操作

函數名稱功能說明函數原型
operator+=在字符串后追加字符串str

string& operator+= (char c);

string& operator+= (const char* s);

c_str返回指向C格式字符串的指針const char* c_str() const;
find

從字符串pos位置開始往后找字符c,

返回該字符在字符串中的位置

size_t find(char c,size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;

特別說明:

  • 在string尾部追加字符時,s.push_back(c) / s.append(1, c) / s += 'c'三種的實現方式差不多,一般情況下string類的+=操作用的比較多,因為+=操作不僅可以連接單個字符,還可以連接字符串

5. string類非成員函數

函數名稱功能說明函數原型
operator>>輸入運算符重載istream& operator>> (istream& is, string& str);
operator<<輸出運算符重載ostream& operator<< (ostream& os, const string& str);
getline獲取一行字符串istream& getline (istream& is, string& str);

?特別說明:

  • ????????getline –> 獲取一行數據(包括空格),cin不能獲取空格,遇到空格就結束

vs和g++下string結構的說明

vs下string的結構

union _Bxty
{   // storage for small buffer or pointer to larger onevalue_type _buff[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

?string在vs下總共占28個字節,內部結構稍微復雜一點,先是有一個聯合體,聯合體用來定義string中字符串的存儲空間:其實當size()的長度小于_buff的長度時,會優先存儲在buff里面;當size()的長度大于_buff的長度時,才會存儲在堆上新開辟的空間(擴容)里面。

這種設計也是有一定道理的,大多數情況下字符串的長度都小于16,那string對象創建好之后,內部已經有了16個字符數組的固定空間,不需要通過堆創建空間,效率高。


g++下string的結構

struct _Rep_base
{size_t       _M_size;size_t       _M_capacity;_Atomic_word _M_refcount;
}

?g++下,string是通過寫時拷貝實現的,string對象總共占4個字節,內部只包含了一個指針,該指針將來指向一塊堆空間,內部包含了如下字段:

  • 空間總大小
  • 字符串有效長度
  • 引用計數
  • 指向堆空間的指針,用來存儲字符串

string類的模擬實現

與常用接口類似,這里只實現一些常用的

1.string類的默認成員函數

//構造函數
string(const char* str = "")     //字符串后面默認有一個\0,所以這里缺省值不需要 \0: _size(strlen(str))
{_str = new char[_size + 1];_capacity = _size;strcpy(_str, str);
}
//拷貝構造
//傳統寫法
string(const string& s)
{char* tmp = new char[s._capacity + 1];strcpy(tmp, s._str);_str = tmp;_size = s._size;_capacity = s._capacity;
}//現代寫法
string(const string& s)
{string tmp(s._str);        //調用構造swap(tmp);                 //std::swap(tmp._str, _str);std::swap(tmp._size, _size);std::swap(tmp._capacity, _capacity);
}
//賦值重載
//傳統寫法
string& operator=(const string& s)
{if (this != &s)            //防止出現自己給自己賦值的情況{char* tmp = new char[s._capacity + 1];strcpy(tmp, s._str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;
}
//現代寫法1
string& operator=(const string& s)
{if (this != &s){string tmp(s._str);   //調用構造swap(tmp);            //std::swap(tmp._str, _str);std::swap(tmp._size, _size);std::swap(tmp._capacity, _capacity);}return *this;
}
//現代寫法2
string& operator=(string tmp)
{swap(tmp);                //調用拷貝構造return *this;
}

?2string類對象的修改相關函數

//查找一個字符串里是否有相應的字符
size_t find(char ch, size_t pos = 0)
{assert(pos < _size);for (int i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;
}
//查找一個字符串里是否有相應的子串
size_t find(const char* sub, size_t pos = 0)
{assert(pos < _size);char* ptr = strstr(_str + pos, sub);return ptr - _str;
}
//查找子串
string substr(size_t pos = 0, size_t len = npos)
{assert(pos < _size);if (len > _size - pos){string sub(_str + pos);        //構造一個子串return sub;}else{string sub;sub.reserve(len);              //為構造的子串開空間for (int i = 0; i < len; i++){sub += _str[pos + i];      //尾插}return sub;}
}

?3.string類非成員函數

//流提取
ostream& operator<<(ostream& os, string& str)
{for (size_t i = 0; i < str.size(); i++){os << str[i];}return os;
}
//流插入
istream& operator>>(istream& is, string& str)
{str.clear();        //清空有效數據char buff[128];     //開一個char類型的最大數組int i = 0;char ch = is.get();while (ch != ' ' && ch != '\n'){buff[i++] = ch; //讀到的數據放到數組buff里if (i == 127)    {buff[i] = '\0';str += buff;//i = 0;}ch = is.get();}if (i != 0){buff[i] = '\0';str += buff;}return is;
}

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

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

相關文章

深入理解計算機系統 CSAPP 家庭作業6.45

CS:APP3e, Bryant and OHallaron 可以參考這里 void bijk(array A, array B, array C, int n, int bsize) {int i, j, k, kk, jj;double sum;int en bsize*(n/bsize);for (i 0; i < n; i)for (j 0; j < n; j)C[i][j] 0.0;for (kk 0; kk < en; kk bsize) {for (j…

QT拖放事件之八:通過全局剪切板中的接口QClipboard::mimeData()來獲取MIME類型數據

1、演示效果 首先向剪切板寫入數據,然后點擊paste按鈕進行從全局剪切板中 獲取 MIME數據。。。 2、核心代碼 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

前端路由中的meta、matched是什么?有哪些作用?

在前端路由中&#xff0c;尤其是在 Vue.js 這樣的框架中&#xff0c;meta 和 matched 是兩個常見的概念&#xff0c;它們提供了關于路由的額外信息和上下文 1. meta 一個可以附加到 Vue Router 路由定義上的自定義字段 它通常用于存儲一些與路由相關的元數據或信息&#xff0…

算法07 深度優先搜索及相關問題詳解

深搜與廣搜是搜索算法中最常用的兩種算法&#xff0c;通過深度優先搜索解決問題還會用到回溯和剪枝&#xff0c;讓我們一起進入本章&#xff0c;了解深搜的基本概念和模板&#xff0c;并學會解決一些常見問題。 目錄 問題導入 走迷宮問題 如何走&#xff1f; 問題建模 如何…

python ----- xml 命名空間與xpath詳解

一、簡介 本文章以如下xml 樣例進行講解命名空間和xpath xml_text"""<?xml version"1.0"?><actors xmlns:fictional"http://characters.example.com"xmlns"http://people.example.com"><actor><name>…

SpringBean的管理

一、bean的名字與標識符 <bean id"" class""></bean> bean的名字作用: 獲取這個bean通過bean名字獲取 bean名字配置方式: id: 唯一標志符, 命名規范與變量命名規范一樣, 包含特殊符號name: 配置名字: 可以包含特殊符號,沒有要求, 比如. 一…

基于支持向量機的垃圾郵件分類,使用SVM+flask+vue

sms-classify 基于支持向量機的垃圾郵件分類&#xff0c;使用SVMflaskvue 數據集和源碼地址 數據集 SMS Spam Collection Data Set 來源于 UCI。樣例被分為非垃圾郵件&#xff08;86.6%&#xff09;和垃圾郵件&#xff08;13.4%&#xff09;&#xff0c;數據格式如下&#xff…

網絡爬蟲中Xpath的使用方法

正則表達式雖然可以處理包含了諸如 HTML 或 XML 內容的字符串&#xff0c;但只能根據文本的 特征匹配字符串&#xff0c;而忽略字符串所包含的內容的真實格式。為了解決這個問題&#xff0c;Python 引入 XPath 以及支持 XPath 的第三方庫 lxml&#xff0c;專門對 XML 或 HTML 格…

git 合并master到分支

master分支的代碼領先自己的分支,git 如何把master分支代碼合并到自己的分支 1.首先切換到主分支 git checkout master 2.使用git pull 把領先的主分支代碼pull下來 git pull 3.切換到自己的分支 git checkout xxx(自己的分支) 4.把主分支的代碼merge到自己的分支 git merge ma…

minio+tusd+uppy搭建文件上傳服務

1、docker部署minio、tusd服務 1.1 新建docker-compose.yml minio API: http://ip:9100 minio控制臺: http://ip:9101 tus API: http://ip:9102/files/ tus webhooh: http:172.0.0.1:3000/files/webhooh(用戶鑒權API) version: 3.7services:minio:image: minio/minio:RELEAS…

亞馬遜運營專詞(一)

許多新入駐亞馬遜的大陸賣家&#xff0c;對亞馬遜的專業詞匯還不太了解&#xff0c;導致在運營店鋪的過程出現一些問題&#xff0c;今天就來講解一下亞馬遜常用的運營專詞&#xff0c;方便新手賣家深入了解。 1. Listing&#xff1a;亞馬遜listing指的是產品的詳情頁面&#xf…

通過BLE實現類似UART的串行通信:NUS服務 vs GATT服務

在物聯網和智能設備的發展中&#xff0c;藍牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;技術已經成為無線數據傳輸的重要手段。本文將介紹通過BLE實現類似UART的串行通信&#xff0c;并對比NUS服務和GATT服務的使用場景&#xff0c;幫助開發者更好地選擇適合的技…

2024越南醫藥、制藥機械展

2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會 時間&#xff1a; 2024年11月21--23日 地點&#xff1a;越南胡志明市-西貢會展中心SECC 2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會將于2024年11月21-23日在越南胡志明市盛大舉行&#xff01;展覽會以國際化、專…

【Feature Pyramid Networks for Object Detection】

Feature Pyramid Networks for Object Detection 摘要引言2 相關工作3 FPN4 應用摘要 特征金字塔是識別系統中用于檢測不同尺度對象的基本組件。但是,最近的深度學習對象檢測器已經避免了金字塔表示,部分原因是它們在計算和內存方面都很密集。在這篇論文中,我們利用深度卷積…

LeetCode經典題之876、143 題解及延伸

系列目錄 88.合并兩個有序數組 52.螺旋數組 567.字符串的排列 643.子數組最大平均數 150.逆波蘭表達式 61.旋轉鏈表 160.相交鏈表 83.刪除排序鏈表中的重復元素 389.找不同 1491.去掉最低工資和最高工資后的工資平均值 896.單調序列 206.反轉鏈表 92.反轉鏈表II 141.環形鏈表 …

paddleocr查看標注好的數據錯誤信息

字符計數 import os import json from collections import Counter# 按字符計數 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面試題:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 將數據的存儲和索引放在一塊,索引結構的葉子節點保存了行數據 索引字段必須存在,且只能存在一個 非聚集索引(二級索引) 將數據和索引分開存儲,索引結構的葉子節點關聯的是對應的主鍵 索引字段可以存在多個 索引的選取規則 如果…

【學習】常用的分類網絡

1. LeNet 提出時間&#xff1a;1998年最新版本&#xff1a;原始版本使用的數據集格式&#xff1a;MNIST&#xff08;28x28灰度圖像&#xff09;優點&#xff1a; 結構簡單&#xff0c;易于理解和實現。對于小規模圖像數據集&#xff08;如MNIST&#xff09;有很好的表現。缺點…

豆瓣高分項目管理書籍推薦

&#x1f4ec;豆瓣網站上有很多項目管理領域的書籍獲得了較高的評分&#xff0c;以下是一些高分項目管理書籍的精選列表&#xff0c;發出來跟大家分享一下&#xff1a; 《項目管理知識體系指南&#xff08;PMBOK指南&#xff09;》 【內容簡介】這本書是美國項目管理協會&…

opencv檢測圖片上七種顏色,分辨顏色和對應位置

opencv檢測圖片上七種顏色&#xff0c;分辨顏色和對應位置 讀取圖片&#xff1a;使用cv2.imread()函數讀取目標圖片。 轉換顏色空間&#xff1a;通常在HSV顏色空間中進行顏色檢測&#xff0c;因為HSV顏色空間更適合描述顏色的屬性。 定義顏色范圍&#xff1a;為七種顏色定義…