第三章 字符串、向量和數組
主要介紹兩種重要的標準庫 string 和 vector 還有內置數組類型。
3.1 命名空間的using聲明
using聲明具有以下格式:using namespace::name;
#include <iostream>
using std::cin;
int main()
{
int i;
cin >>i; //正確:cin和std::cin含義相同
cout<<i; //錯誤:沒有指定那個命名空間
return 0;
}
個人理解:命名空間就相當於一個倉庫,描述倉庫裏面的東西需要指定倉庫,要不對方不知道是哪個倉庫的東西。
- 每個名字都需要獨立的using聲明
- 頭文件不應包含using聲明
3.2 標準庫類型string
標準庫類型string: 表示可變長的字符串序列,使用string類型必須首先包含string頭文件:
#include <string>
using namespace std::string;
3.2.1 定義和初始化string對象
#include <iostream>
#include <string>
using namespace std;
using namespace std::string;
int main()
{
string s1; //默認初始化,s1是一個空串
string s2(s1); //s2是s1的副本
string s2=s1; //等價於s2(s1),s2是s1的副本
string s3("value"); //s3是字面值"value"的副本,除了字面值最後的那個空字符外
string s3="value"; //等價於s3("value"),s3是字面值"value"的副本
string s4(n,'c'); // 把s4初始化爲由連續n個字符c組成的串
}
- 直接初始化和拷貝初始化
- 拷貝初始化:如果使用等號(=)初始化一個變量,實際上執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新創建的對象中去。
- 直接初始化:如果不使用等號,則執行的是直接初始化。
string s5="hiya"; //拷貝初始化
string s6("hiya"); //直接初始化
string s7(10,'c'); //直接初始化
3.2.2 string對象上的操作
- 讀寫string對象
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s; //空字符串
cin>>s; //將string對象讀入s,遇到空白停止
cout<<s<<endl; //輸出s
return 0;
}
- 讀取未知數量的string對象
#include <iostream>
#include <string>
using namespace std;
int main()
{
string word;
while(cin>>word) //反覆讀取,直至到達文件末尾
{
cout<<word<<endl; //逐個輸出單詞,每個單詞後面緊跟一個換行
}
return 0;
}
- 使用getline讀取一整行
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
while(getline(cin,line)) //每次讀取一整行
{
cout<<line<<endl; //輸出整行
}
return 0;
}
- string的empty和size操作
- empty: 函數根據string對象是否爲空返回一個對應的bool值。
- size : 函數返回string對象的長度
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
while(getline(cin,line)) //每次讀取一整行
{
if(!line.empty()&&line.size()>80) //如果不爲空 並且 字符數大於80
{
cout<<line<<endl; //輸出整行
}
}
return 0;
}
- string::size_type類型
size函數返回的是一個 size_type,是一個無符號的整型數,如果在表達式中混用了帶符號數和無符號數將可能產生一項不到的結果。 - 比較string對象
- 相等性運算符(==)
分別檢驗兩個string對象相等或不相等,string對象相等意味着他們的長度相同而且所包含的字符也全部相同。 - 關係運算符
<、<=、>、>=分別檢驗一個string對象是否小於、小於等於、大於、大於等於另外一個string對象。
- 相等性運算符(==)
- 兩個string對象相加
string s1="hello,",s2="world\n";
string s3=s1+s2; //s3的內容是hello,world\n
s1+=s2; // 等價於 s1=s1+s2
3.2.3 處理string對象中的字符
這段需要看標準庫了,上面的已經夠用了。
3.3 標準庫類型vector
標準庫類型vector 表示對象的集合,其中所有對象的類型都相同。因爲vecotr容納着其他對象,所以他們也被稱作容器。
3.3.1 定義和初始化vector對象
- 初始化vector對象的方法
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> iVector; //初始狀態爲空
vector<string> sVector //初始化爲空
//列表初始化
vector<string> articles={"a","an","the"};
//創建指定數量的元素
vector<int> iVector(10,-1); //10個int類型的元素,每個初始化爲-1
}
3.3.2 向vector對象中添加元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> iVector; //空vector對象
//增加
for(int i=0;i<=100;i++)
{
iVector.push_back(i);
}
//遍歷
for(int value in iVector)
{
cout<<"value"<<value<<endl;
}
return 0;
}
3.3.3 其他vector操作
注意:只能對確知已存在的元素才能執行下標操作
3.5 數組
數組可以理解爲大小不變的標準庫類型vector的數據結構。
3.5.1 定義和初始化內置數組
unsigned cnt=1024; //不是常量表達式
constexpr unsigned sz=1024; //常量表達式
int arr[10]; //含有10個整數的數組
int *parr[sz]; //含有10個整數指針的數組
string bad[cnt]; //cnt不是常量表達式
string strs[get_size()]; //當get_size是constexpr時正確;否則錯誤
/**
*顯示初始化數組
*/
const unsigned sz=3;
int iArr[sz]={0,1,3};
int arr[]={0,1,3};
- 字符串的特殊性:字符串是以空格結尾的
char a1[]={'c','+','+'}; //列表初始化,沒有空字符串
char a2[]={'C','+','+','\0'}; //列表初始化,含有顯示的空字符串
char a3[]="C++"; //列表初始化,含有隱式的空字符串
const char a4[6]="Daniel"; //錯誤:沒有空間可存放空字符串
- 不允許拷貝和賦值
int a[]={0,1,2}; //含有3個整數的數組
int a2[]=a; //錯誤: 不允許使用一個數組初始化另一個數組
a2=a; //錯誤:不能把一個數組直接賦值給另一個數組
3.5.2 訪問數組元素
unsigned scores[11]={}; //11個分數段,全部初始化爲0
unsigned grade;
while(cin>>grade)
{
if(grade<=100)
{
++scores[grade/10]; //將當前分數段的計算值加1
}
}
3.5.3 指針和數組
在大多數表達式中,使用數組類型的對象其實是使用一個指向該數組首元素的指針
string nums[]={"one","two","three"};
string *p=&nums[0]; //等價於 *p=nums;
- 指針也是迭代器
int arr[]={0,1,2,3,4,5,6,7,8,9};
int *p=arr;
++p;
cout << "++p:" << *++p << endl;
3.5.4 C風格字符串
- C標準庫String函數