C Note 字串和容器

2021-10-09 17:40:39 字數 2222 閱讀 1063

慢慢抄《c++ primer》,補習c++知識……

《c++ primer》(第五版)3.5.5節中講述了string物件和c風格字串混用的方法。

std::string比char好用很多,比如說可以簡單地將兩個字串前後拼接起來。然而在root中大多數型別的成員方法都是以c風格字串作為形參的。比如說讀取乙個.root檔案,需要使用tfile::open(const char* name),但是如果你想遍歷很多root檔案,而他們的檔名是類似於「字首+數字+字尾」這種形式的,那你可能就想能不能提前定義字首、字尾、中綴的字串,然後把它們拼接起來作為輸入,這樣就只有string才能滿足你這種要求。所以就需要有一種方法能把string轉換成const char*。

主要就是string的乙個成員函式c_str()可以返回乙個const char*。

下面是個例子:

std::string prefix = "ana_pi+gamma_15gev5gev_";

std::vectorshiftnumber = ;

std::string postfix = ".root";

for (auto &i : shiftnumber)

其中th1d *funcgethist(const char* filename)是我自己寫的乙個函式,從tfile裡拿tree出來用。

我們無法保證c_str函式返回的陣列一直有效,事實上,如果後續的操作改變了s(string物件)的值,就可能讓之前返回的陣列失去效用。

如果執行完c_str()函式後程式想一直都能使用其返回的陣列,最好將該陣列重新拷貝乙份。

c++的陣列可以組織由int、double、char等型別的基本變數資料構成的結構,然而,作為乙個計算機門外漢,我一直沒找到但是感覺很需要一種工具,可以將任意一種型別的資料組織起來,形成乙個類似於「元胞陣列」的結構,最好還可以隨時改變這個結構的大小,增減裡面的資料。例如,在上面的例子中,我希望將string型別組織到一起以便遍歷;在處理粒子物理中很多事例時,希望將每個事件的相應物理量組織起來。

後來發現c++中「容器」的概念就可以滿足這樣的需求,它可以將任意型別的物件組織成常見的資料型別,例如將他們排列成列表,或者在兩兩之間構建對映。《c++ primer(第五版)》第九章、第十一章,有講述不同型別的資料結構在各種功能上的特性,可以根據資料的處理方式來選擇相應的容器。

最常用的我覺得還是vector這個型別。《c++ primer(第五版)》的3.3節有簡述vector的使用。

主要想記錄一下自己常用的對於vector容器的遍歷方法:

遍歷陣列時使用sizeof(a)/sizof(a[0]還是可以用:

for (int index=0; index < (int)( sizeof(a)/sizeof(a) ); index++)
其中sizeof()返回的是unsinged int,因此應該盡可能避免和int混用,來避免int被轉化為unsinged。這一點在《c++ primer(第五版)》35頁2.1.2有提到,但我暫時還不知道這種情況下什麼樣的寫法最合適。

使用vector的size()方法:

for (int i = 0; i < a.size(); ++i)
同樣,size()方法返回的是乙個無符號整形數。

範圍for(range for)語句:c++11的新語句,見《c++ primer(第五版)》82頁3.2.3

for (auto c : a)
如果要改變容器a中的元素,可以使用引用for (auto &c :a)

定義迭代器

for  (vector::iterator it = a.begin(); it !=a.end(); ++it)
我用過認為沒問題的方法主要是第一種和第三種,另外兩種用的不多,但是聽說過。不過,如果集群環境中的g++版本只支援c++98,那麼使用第三種方法就會出問題。相比之下,我覺得後兩種更好一些,因為他們看起來可能更整齊,尤其是多個迴圈的情況下,可以一定程度上避免int iint j這樣的混淆。

順序容器 字串操作

include include include using namespace std void replace string string s,const string oldval,const string newval if iter2 oldval.end while iter2 newva...

Python字串與容器

運算子是python中訪問容器元素和切片的運算子 有正向和反向兩種下標,正向下標從0開始,向後遞增 反向下標以 1表示最後乙個元素,2表示倒數第二個字元,向前遞減。不僅可以訪問單個元素還可以使用冒號表示式訪問一段子串行 稱為切片,slice 切片有三種語法 seq begin seq begin e...

Python練習 容器 字串

容器 如果在原有記憶體上修改資料,可能影響其他物件的記憶體 1 在終端中獲取乙個字串,迴圈列印每個字元的編碼值 char input 請輸入字串 for item in char a ord item print a 2 在終端中反覆錄入乙個編碼值,然後列印字串,如果錄入空字串,則退出程式 q in...