慢慢抄《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++的陣列可以組織由int、double、char等型別的基本變數資料構成的結構,然而,作為乙個計算機門外漢,我一直沒找到但是感覺很需要一種工具,可以將任意一種型別的資料組織起來,形成乙個類似於「元胞陣列」的結構,最好還可以隨時改變這個結構的大小,增減裡面的資料。例如,在上面的例子中,我希望將string型別組織到一起以便遍歷;在處理粒子物理中很多事例時,希望將每個事件的相應物理量組織起來。如果執行完c_str()函式後程式想一直都能使用其返回的陣列,最好將該陣列重新拷貝乙份。
後來發現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 i
又int 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...