3.1 名稱空間的using宣告
- 我們用到的庫函數基本上都屬於名稱空間std
- 如果我們想使用std中的一某個名字,需要每次都要std::name
- 因此,我們這檔案開頭這樣宣告:using namespace::name
- 在接下來的程式裡就直接使用name就可以了,無需新增std
- 話說回來,直接using namespace std;它不香嗎?
- 另外注意,標頭檔案不應包含using宣告
3.2 標準庫型別string
3.2.1定義和初始化string物件
#include <string>
string s1;
string s2 = s1;
string s3 = "Queue";
string s4("ueueQ");
string s5(n, 'c')
3.2.2string物件上的操作
- 對string字串的操作
- 注意cin>>s 與 getline(cin, s)的區別
- cin的輸入,會以空格爲分隔符。但是getline不會,它也會接受空格
- 在說一下s.size()這個返回值型別的問題,這個函數是庫裡的,可以結合上一章學過的auto函數,我們要用一個len去接收這個函數的返回值,但是型別我們不知道,這時auto的作用就出來了。即:auto len = s.size(); 當然,我們也可以用decltype(s.size()) len;來實現
3.2.3處理string物件中的字元
- 有時候,我們需要單獨處理string中的單個字元,那麼如何提取呢?
- 如何提取string中的單個字元
string str = "ueueQx_ac";
for(auto c : str)
{
cout<<c<<endl;
}
- 如何修改字串中的字元
string str = "ueueQx_ac";
for(auto &c : str)
{
c = toupper(c);
}
cout<<str<<endl;
- 但是,有時候我們只需要存取其中的某一個特定的字元,而不是對整個字串進行遍歷,這時有兩種方法,一是使用下標,二是使用迭代器
- 下標方法
string str = "UEUEQ_AC";
decltype(str.size()) count;
cin>>count;
cout<<srt[count]<<endl;
- 迭代方法
3.3標準庫型別vector
- vector是模板而非型別,由vector生成的型別必須包含vector中元素的型別
- vector用法總結
3.3.1定義和初始化vector物件
- 關於用圓括號還是花括號,還有列表初始化等等問題,這裏沒有講解,記了也白記,過後就忘了
#include<vector>
vector<int> v1;
vector<int> v2(v1);
vector<int> v2 = v1;
vector<int> v3(10,1);
vector<int> v4(10);
vector<int> v5{325,67,8,7,98,4,3,4,76};
vector<int> v5 = {325,67,8,7,98,4,3,4,76};
vector<string> s1
vector<string> s2{10}
vector<string> s3{10,"Q"}
3.3.2向vector物件中新增元素
- 這一塊無非就是vector它的內建函數們,上邊有傳送門
3.3.3其他的vector問題
- 不允許用下標的形式新增元素!
- 而且,只能對確知已存在的元素執行下標操作!
vector<int> ivec;
cout<<ivec[5]<<endl;
vector<int> ivec(10);
cout<<ivec[5]<<endl;
3.4迭代器
3.4.1使用迭代器
vector<int> v(10);
auto b = v.begin();
auto e = v.end();
- 如果容器爲空,則begin和end返回的是同一個迭代器,都是尾後迭代器
- 例子:當要用迭代器裏面代表的值的時候,一定要解除參照!!!!!!
string str{"ueueQ"};
for(auto b = str.begin(); b != str.end(); ++b)
{
*b = toupper(*b);
}
cout<<str<<endl;
- 對於該型別,知不知道已經無關緊要了,因爲可以用auto去自動的分析
- 每一種容器類都定義了一個iterator的型別
- 但是,我們仍要知道,哈哈,例如
vector<int>::iterator it;
string::iterator str;
vector<int>::const_iterator it;
string::const_iterator str;
auto b = str.cbegin();
auto c = str.cend();
- 迭代器失效:
- 這裏有一點先記住,但凡是在使用了迭代器的回圈體裡,都不要在向迭代器所屬的容器新增元素
3.4.2迭代器運算
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> text{4, 9, 11, 16, 20, 34, 45, 49, 61};
int temp;
cin>>temp;
auto min = text.begin();
auto max = text.end();
auto mid = text.begin() + text.size() / 2;
while(min <= max)
{
if(temp == *mid)
{
cout<<"已經找到"<<endl;
break;
}
else if(temp < *mid)
{
max = mid - 1;
cout<<"小找"<<endl;
}
else
{
min = mid + 1;
cout<<"大找"<<endl;
}
mid = min + (max - min) / 2;
}
return 0;
}