使用string,include和using必須配套使用?
首先我們必須得引入名稱空間。也就是#include一下名稱空間所在的地方。
然後我們才能使用using namespace宣告使用裡面的所有的方法。如果不新增就會報錯。也就是說如果namespace aaa在aaa.h檔案裡面,如果我們沒有#include"aaa.h"就使用using namespace aaa;
那麼就會出現異常。
所以使用 string我們需要使用 #include<string>和using std::string;
string重要的是 構造方法,賦值構造,拷貝構造,過載的運算子,輸入輸出。這幾個都是對應幫助文件的地址,可以自行去檢視實現。
輸入直到檔案末尾的幾種方式。
while(cin<<ss)
while(getline(is,s))
cin和getline都是返回一個輸入檔案流物件。如果是檔案末尾就返回0
提一句:empty和size不同,empty判斷字串長度。size判斷字串佔用的空間。底層的資料結構是一個vector動態陣列。
所以也可以通過resize方法來調整字串的大小。
typedef basic_string<char, char_traits<char>, allocator<char> > string;
string裡面一些內建的類型別名。
typedef basic_string<_Elem, _Traits, _Alloc> _Myt; typedef _String_alloc<_String_base_types<_Elem, _Alloc> > _Mybase; typedef _Traits traits_type; typedef _Alloc allocator_type; typedef typename _Mybase::_Alty _Alty; typedef typename _Mybase::value_type value_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator;
我們經常用到的size_type一般來說是int型別,我們可以通過
typedef typename string::size_type stdr;
std::cout << typeid(stdr).name() << std::endl;
我們可以通過這種方式獲取這個型別。得到的結果是一個無符號整型。
我們也可以通過decltype或者是auto欄位來進行獲取這個欄位的型別。
最好是按照 string::size_type 或者 auto來進行獲取值。
拼接字元
我們可以通過下面的方式進行構造,也是很常用的構造。
string str0 = "str";
string str1 = str0 + "str";
string str2 = "str" + "str";
解析一下上面的。
1 | 隱式轉換->拷貝構造 |
2 | 過載運算子->拷貝構造 |
3 | 錯誤 |
我們可以看見,第二個例子之所以能夠執行是因為我們過載了+運算子,返回了一個string物件,然後執行拷貝構造方法。
第三個為什麼是錯的呢,是因為字面值型別是沒有過載運算子的,而且不能新增。因為基本型別是不能進行
ctype.h裡面的方法進行判斷字元型別。可以自定義,可以用內建庫。
for迭代
可以通過for進行迭代,也可以通過for進行修改,不過一般使用引用,減少記憶體的消耗。
string str = "aaaaa";
for(auto &c : str){
std::cout<<cstd::endl;
}
可以新增引用,也可以不新增引用。這個就是我們記憶體佔用的問題。