国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

精通網(wǎng)站建設 全能建站密碼pdf理發(fā)美發(fā)培訓學校

精通網(wǎng)站建設 全能建站密碼pdf,理發(fā)美發(fā)培訓學校,做客服去哪個平臺比較好,wordpress擴容STL簡介什么是STLSTL(standard template libaray-標準模板庫):是C標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數(shù)據(jù)結構與算法的軟件框架。STL的版本原始版本Alexander Stepanov、Meng Lee 在惠普實驗室完成的原始版本&…

STL簡介

什么是STL

STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數(shù)據(jù)結構與算法的軟件框架。

STL的版本

  • 原始版本

Alexander Stepanov、Meng Lee 在惠普實驗室完成的原始版本,本著開源精神,他們聲明允許任何人任意運用、拷貝、修改、傳播、商業(yè)使用這些代碼,無需付費。唯一的條件就是也需要向原始版本一樣做開源使用。 HP 版本--所有STL實現(xiàn)版本的始祖。

  • P.J.版本

由P. J. Plauger開發(fā),繼承自HP版本,被Windows Visual C++采用,不能公開或修改,缺陷:可讀性比較低,符號命名比較怪異。

  • RW版本

由Rouge Wage公司開發(fā),繼承自HP版本,被C+ + Builder 采用,不能公開或修改,可讀性一般。

  • SGI版本

由Silicon Graphics Computer Systems,Inc公司開發(fā),繼承自HP版 本。被GCC(Linux)采用,可移植性好,可公開、修改甚至販賣,從命名風格和編程 風格上看,閱讀性非常高。我們后面學習STL要閱讀部分源代碼主要參考的就是這個版本。

STL的六大組件

仿函數(shù)、算法、迭代器、空間適配器、容器、配接器

STL的缺陷

  1. STL庫的更新太慢了。這個得嚴重吐槽,上一版靠譜是C++98,中間的C++03基本一些修訂。C++11出來已經(jīng)相隔了13年,STL才進一步更新。

  1. STL現(xiàn)在都沒有支持線程安全。并發(fā)環(huán)境下需要我們自己加鎖。且鎖的粒度是比較大的。

  1. STL極度的追求效率,導致內部比較復雜。比如類型萃取,迭代器萃取。

  1. STL的使用會有代碼膨脹的問題,比如使用vector/vector/vector這樣會生成多份代碼,當然這是模板語法本身導致的。

string類

為什么學習string類

C語言中,字符串是以'\0'結尾的一些字符的集合,為了操作方便,C標準庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問。

標準庫中的string類

string類的文檔介紹:

https://cplusplus.com/reference/string/string/?kw=string

  1. 字符串是表示字符序列的類

  1. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作單字節(jié)字符字符串的設計特性。

  1. string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關于模板的更多信息,請參閱basic_string)。

  1. string類是basic_string模板類的一個實例,它使用char來實例化basic_string模板類,并用char_traits和allocator作為basic_string的默認參數(shù)(根于更多的模板信息請參考basic_string)。

  1. 注意,這個類獨立于所使用的編碼來處理字節(jié):如果用來處理多字節(jié)或變長字符(如UTF-8)的序列,這個類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(jié)(而不是實際編碼的字符)來操作。

總結:

  1. string時表示字符串的字符串類。

  1. 該類的接口與常規(guī)容器接口基本相同,再添加了一些專門用來操作string的常規(guī)操作。

  1. string在底層實際是:basic_string模板類的別名,typedef basic_string<char,char_traits,allocator> string;

  1. 不能操作多字節(jié)或者變長字符的序列。

string類的常用接口說明(最常用的接口)

  • string類對象的常見構造

(constructor)函數(shù)名稱

功能說明

string()

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

string(const char* s)

用C-string來構造string類對象

string(size_t n,char c)

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

string(const string& s)

拷貝構造函數(shù)

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

string類對象的容量操作

函數(shù)名稱

功能說明

size

返回字符串有效字符長度

length

返回字符串有效字符長度

capacity

返回空間總大小

empty

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

clear

清空有效字符

reserve

為字符串預留空間

resize

將有效字符的個數(shù)改成n個,多出的空間用字符c填充

// size/clear/resize
void Teststring1()
{// 注意:string類對象支持直接用cin和cout進行輸入和輸出string s("hello, bit!!!");cout << s.size() << endl;cout << s.length() << endl;cout << s.capacity() << endl;cout << s <<endl;// 將s中的字符串清空,注意清空時只是將size清0,不改變底層空間的大小s.clear();cout << s.size() << endl;cout << s.capacity() << endl;// 將s中有效字符個數(shù)增加到10個,多出位置用'a'進行填充// “aaaaaaaaaa”s.resize(10, 'a');cout << s.size() << endl;cout << s.capacity() << endl;// 將s中有效字符個數(shù)增加到15個,多出位置用缺省值'\0'進行填充// "aaaaaaaaaa\0\0\0\0\0"// 注意此時s中有效字符個數(shù)已經(jīng)增加到15個s.resize(15);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;// 將s中有效字符個數(shù)縮小到5個s.resize(5);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;
}
//==============================================================================
void Teststring2()
{string s;// 測試reserve是否會改變string中有效元素個數(shù)s.reserve(100);cout << s.size() << endl;cout << s.capacity() << endl;// 測試reserve參數(shù)小于string的底層空間大小時,是否會將空間縮小s.reserve(50);cout << s.size() << endl;cout << s.capacity() << endl;
}
// 利用reserve提高插入數(shù)據(jù)的效率,避免增容帶來的開銷
//==============================================================================
void TestPushBack()
{string s;size_t sz = s.capacity();cout << "making s grow:\n";for (int i = 0; i < 100; ++i){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << '\n';}}
}
void TestPushBackReserve()
{string s;s.reserve(100);size_t sz = s.capacity();cout << "making s grow:\n";for (int i = 0; i < 100; ++i){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << '\n';}}
}

【注意】

  1. size()與length()方法底層實現(xiàn)原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。

  1. clear()只是將string中有效字符清空,不改變底層空間大小。

  1. resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數(shù)改變到n個,不同的是當字符個數(shù)增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的元素空間。注意:resize在改變元素個數(shù)時,如果是將元素個數(shù)增多,可能會改變底層容量的大小,如果是將元素個數(shù)減少,底層空間總大小不變。

  1. reserve(size_t res_arg=0):為string預留空間,不改變有效元素個數(shù),當reserve的參數(shù)小于string的底層空間總大小時,reserver不會改變容量大小。

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

函數(shù)名稱

功能說明

operator[]

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

begin+end

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

rbegin+rend

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

范圍for

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

void Teststring()
{string s1("hello Bit");const string s2("Hello Bit");cout<<s1<<" "<<s2<<endl;cout<<s1[0]<<" "<<s2[0]<<endl;s1[0] = 'H';cout<<s1<<endl;// s2[0] = 'h'; 代碼編譯失敗,因為const類型對象不能修改
}
void Teststring()
{string s("hello Bit");// 3種遍歷方式:// 需要注意的以下三種方式除了遍歷string對象,還可以遍歷是修改string中的字符,// 另外以下三種方式對于string而言,第一種使用最多// 1. for+operator[]for(size_t i = 0; i < s.size(); ++i)cout<<s[i]<<endl;// 2.迭代器string::iterator it = s.begin();while(it != s.end()){cout<<*it<<endl;++it;}string::reverse_iterator rit = s.rbegin();while(rit != s.rend())cout<<*rit<<endl;// 3.范圍forfor(auto ch : s)cout<<ch<<endl;
}

string類對象的修改操作

函數(shù)名稱

功能說明

push_back

在字符串后尾插字符c

append

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

operator+=

在字符串后追加字符串str

c_str

返回C格式的字符串

find+npos

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

rfind

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

substr

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

void Teststring()
{string str;str.push_back(' '); // 在str后插入空格str.append("hello"); // 在str后追加一個字符"hello"str += 'b'; // 在str后追加一個字符'b' str += "it"; // 在str后追加一個字符串"it"cout<<str<<endl;cout<<str.c_str()<<endl; // 以C語言的方式打印字符串// 獲取file的后綴string file1("string.cpp");size_t pos = file.rfind('.');string suffix(file.substr(pos, file.size()-pos));cout << suffix << endl;// npos是string里面的一個靜態(tài)成員變量// static const size_t npos = -1;// 取出url中的域名sring url("http://www.cplusplus.com/reference/string/string/find/");cout << url << endl;size_t start = url.find("://");if (start == string::npos){cout << "invalid url" << endl;return;}start += 3;size_t finish = url.find('/', start);string address = url.substr(start, finish - start);cout << address << endl;// 刪除url的協(xié)議前綴pos = url.find("://");url.erase(0, pos+3);cout<<url<<endl;
}

【注意】

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

  1. 對string操作時,如果能夠大概預估到放多少字符,可以先通過reserve把空間預留好。

string類非成員函數(shù)

函數(shù)

功能說明

operator+

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

operator>>

輸入運算符重載

operator<<

輸出運算符重載

getline

獲取一行字符串

relational operators

大小比較

運用

  • 僅僅反轉字母

class Solution {
public:string reverseOnlyLetters(string S) {char* pLeft = (char*)S.c_str();char* pRight = pLeft + (S.size()-1);while(pLeft < pRight){// 從前往后找,找到一個字母while(pLeft < pRight){// 找到有效字母后停下來if(isalpha(*pLeft))break;++pLeft;}// 從后往前找,找一個字母while(pLeft < pRight){// 找到有效字母后停下來if(isalpha(*pRight))break;--pRight;}if(pLeft < pRight){swap(*pLeft, *pRight);++pLeft;--pRight;}}return S;}
};
  • 找字符串中第一個只出現(xiàn)一次的字符

class Solution {
public:int firstUniqChar(string s) {// 統(tǒng)計每個字符出現(xiàn)的次數(shù)int count[256] = {0};int size = s.size();for(int i = 0; i < size; ++i)count[s[i]] += 1;// 按照字符次序從前往后找只出現(xiàn)一次的字符for(int i = 0; i < size; ++i)if(1 == count[s[i]])return i;return -1;}
};
  • 字符串里面最后一個單詞的長度

#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;
}
  • 驗證一個字符串是否回文

class Solution {
public:bool isLetterOrNumber(char ch){return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}bool isPalindrome(string s) {// 先小寫字母轉換成大寫,再進行判斷for(auto& ch : s){if(ch >= 'a' && ch <= 'z')ch -= 32;}int begin = 0, end = s.size()-1;while(begin < end){while(begin < end && !isLetterOrNumber(s[begin]))++begin;while(begin < end && !isLetterOrNumber(s[end]))--end;if(s[begin] != s[end]){return false;}else{++begin;--end;}}return true;}
};
  • 字符串相加

class Solution {
public:string addstrings(string num1, string num2) {// 從后往前相加,相加的結果到字符串可以使用insert頭插// 或者+=尾插以后再reverse過來int end1 = num1.size()-1;int end2 = num2.size()-1;int value1 = 0, value2 = 0, next = 0;string addret;while(end1 >= 0 || end2 >= 0){if(end1 >= 0)value1 = num1[end1--]-'0';elsevalue1 = 0;if(end2 >= 0)value2 = num2[end2--]-'0';elsevalue2 = 0;int valueret = value1 + value2 + next;if(valueret > 9){next = 1;valueret -= 10;}else{next = 0;}//addret.insert(addret.begin(), valueret+'0');addret += (valueret+'0');}if(next == 1){//addret.insert(addret.begin(), '1');addret += '1';}reverse(addret.begin(), addret.end());return addret;}
};

string類的模擬實現(xiàn)

namespace bit
{class string{public:typedef char* iterator;public:string(const char* str = ""){_size = strlen(str);_capacity = _size;_str = new char[_capacity+1];strcpy(_str, str);}string(const string& s): _str(nullptr), _size(0), _capacity(0){string tmp(s);this->Swap(tmp);}string& operator=(string s){this->Swap(s)return *this;}~string(){if (_str){delete[] _str;_str = nullptr;}}/// iteratoriterator begin() {return _str;}iterator end(){return _str + _size;}/// modifyvoid push_back(char c){if (_size == _capacity)Reserve(_capacity*2);_str[_size++] = c;_str[_size] = '\0';}string& operator+=(char c){PushBack(c);return *this;}// 作業(yè)實現(xiàn)void append(const char* str);string& operator+=(const char* str); void clear(){_size = 0;_str[_size] = '\0';}void swap(string& s){swap(_str, s._str);swap(_size, s._size);swap(_capacity, s._capacity);}const char* c_str()const{return _str;}/// capacitysize_t size()constsize_t capacity()constbool empty()constvoid resize(size_t newSize, char c = '\0'){if (newSize > _size){// 如果newSize大于底層空間大小,則需要重新開辟空間if (newSize > _capacity){Reserve(newSize);}memset(_str + _size, c, newSize - _size);}_size = newSize;_str[newSize] = '\0';}void reserve(size_t newCapacity){// 如果新容量大于舊容量,則開辟空間if (newCapacity > _capacity){char* str = new char[newCapacity + 1];strcpy(str, _str);// 釋放原來舊空間,然后使用新空間delete[] _str;_str = str;_capacity = newCapacity;}}// accesschar& operator[](size_t index){assert(index < _size);return _str[index];}const char& operator[](size_t index)const{assert(index < _size);return _str[index];}// 作業(yè)bool operator<(const string& s);bool operator<=(const string& s);bool operator>(const string& s);bool operator>=(const string& s);bool operator==(const string& s);bool operator!=(const string& s);// 返回c在string中第一次出現(xiàn)的位置size_t find (char c, size_t pos = 0) const;// 返回子串s在string中第一次出現(xiàn)的位置size_t find (const char* s, size_t pos = 0) const;// 在pos位置上插入字符c/字符串str,并返回該字符的位置string& insert(size_t pos, char c);string& insert(size_t pos, const char* str);// 刪除pos位置上的元素,并返回該元素的下一個位置string& erase(size_t pos, size_t len);private:friend ostream& operator<<(ostream& _cout, const bit::string& s);friend istream& operator>>(istream& _cin, bit::string& s);private:char* _str;size_t _capacity;size_t _size;};
}
ostream& bit::operator<<(ostream& _cout, const bit::string& s)
{// 不能使用這個//cout << s._str;for(size_t i = 0; i < s.size(); ++i){_cout<<s[i];}return _cout;
}
///對自定義的string類進行測試
void TestBitstring()
{bit::string s1("hello");s1.push_back(' ');s1.push_back('b');s1.append(1, 'i');s1 += 't';cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;// 利用迭代器打印string中的元素string::iterator it = s1.begin();while (it != s1.end()){cout << *it<<" ";++it;}cout << endl;// 這里可以看到一個類只要支持的基本的iterator,就支持范圍forfor(auto ch : s1)cout<<ch<<" ";cout<<endl;
}
http://aloenet.com.cn/news/43720.html

相關文章:

  • 公司網(wǎng)站制作推廣公司
  • 電子商務網(wǎng)站有哪幾種搜索引擎營銷的常見方式
  • 網(wǎng)站代理游戲合川網(wǎng)站建設
  • 蘇州專業(yè)高端網(wǎng)站建設公司專業(yè)制作網(wǎng)站的公司哪家好
  • 泰州網(wǎng)站建設服務熱線全網(wǎng)推廣軟件
  • 免費推廣網(wǎng)站2023mmm網(wǎng)絡營銷項目
  • 桐鄉(xiāng)住房和城鄉(xiāng)規(guī)劃建設局網(wǎng)站如何做網(wǎng)絡銷售產(chǎn)品
  • 上海網(wǎng)站設計工具網(wǎng)絡推廣運營團隊
  • 建設廳特種作業(yè)證件查詢官網(wǎng)網(wǎng)站優(yōu)化推廣公司
  • 重慶品牌網(wǎng)站建設優(yōu)化網(wǎng)站排名方法
  • 網(wǎng)站設計導航欄高度佛山市人民政府門戶網(wǎng)站
  • 網(wǎng)站建設詢價文件無錫營銷型網(wǎng)站制作
  • 海爾集團電商網(wǎng)站建設百度網(wǎng)頁版進入
  • 怎樣在國外網(wǎng)站做推廣搜索關鍵詞排名一般按照什么收費
  • 做網(wǎng)站做軟件怎么賺錢嗎搜索量最大的關鍵詞
  • 咸秧草做哪些網(wǎng)站優(yōu)化大師免安裝版
  • 鄭州做網(wǎng)站推廣外包產(chǎn)品推廣方式
  • 鞍山網(wǎng)站制作公司優(yōu)化綠松石什么意思
  • 泉州建設網(wǎng)站開發(fā)快速排名優(yōu)化
  • 湖南做網(wǎng)站磐石網(wǎng)絡案例cba最新排名
  • 淘寶的網(wǎng)站建設seo分析報告怎么寫
  • 網(wǎng)站如何提高權重做百度推廣怎么做才能有電話
  • 響應式網(wǎng)站建設效果迅雷下載磁力天堂
  • 萬網(wǎng)個人網(wǎng)站備案查詢東莞今天的最新通知
  • 有關做聚合物電池公司的網(wǎng)站網(wǎng)站優(yōu)化外包推薦
  • 如何再國外網(wǎng)站做折扣什么是seo?
  • 中關村在線官方網(wǎng)站電腦首頁關鍵詞排名
  • 愛站網(wǎng)排行榜武漢抖音seo搜索
  • 網(wǎng)站設計app微信推廣方式有哪些
  • sf網(wǎng)站怎么建設網(wǎng)站被禁用如何解決