C++中的資料類型,有語言既定的内部資料類型,也有程式員自定義的外部資料類型。
内部資料類型:
整數類型(int)
字元類型(char)
布爾類型(bool)
單精度浮點(float)
雙精度浮點(double)
還可以通過數組、指針、引用等來定義基于上面這些資料類型以及其他外部資料類型的編譯類型。例如:
整型數組(int[])
浮點引用(double&)
字元指針(char*)
程式員自定義的資料類型主要是指用class關鍵字狗仔的資料類型。除此之外,用enum、union、struct關鍵字也能定義單純空間意義上的資料類型。
整型
1、二進制補碼
2、整型數表示範圍

3、編譯器與整數長度
一、整數子類
1.1、字元型(char type)
轉義字元
生成一個字母正三角形
#include<iostream>
#include<string>
using namespace std;
int main()
{
for(int i=; i<=; ++i)
{
cout<<string(-i, ' ');
for(char ch='A'; ch<=+*i; ++ch)
cout<<ch;
cout<<endl;
}
system("pause");
}
結果展示
1.2、枚舉型(enum type)
枚舉型是對整數區間的自定義類型,使用者還可以為區間中的值取名,例如:
enum Week{Mon,Tue,Wed,Thu,Fri,Sat,Sun};
定義枚舉時,其花括号中的名稱代表某個整數值,預設時,第一個名稱對應整數0,第二個對應1,以此類推。是以,Week中,Mon=0,Tue=1,…,Sun=6.
也可以認為規定,例如:
enum Color{Red=5,Green,Yellow,Blue=20,Orange};
則Green對應6,Yellow對應7,Orange對應21。
枚舉符一旦定義則不能改變。是以它常常代替整數常量使用。這才是語言設計枚舉的真實意圖。有時候甚至比整數常量還管用,因為在進入函數調用或其他子產品時,常量需要初始化,而枚舉缺失一種類型,無須定義其屍體,便可以直接使用其枚舉符。
1.3、布爾型(bool type)
整數1和0兩個值構成了bool型的表示範圍。相當于:
enum bool{false, true};
bool型
的輸出形式可以選擇,預設為整數1和0,如果要輸出true和false,則可用輸出控制符:
cout<<boolalpha<<d<<endl; //輸出結果為:false
**
二、浮點型(float type)
**
用程式檢視單精度浮點數的二進制碼
#include<iostream>
#include<string>
using namespace std;
int main()
{
float f= ;
unsigned int* pa = reinterpret_cast<int*>(&f);
for (int i =; i>=; i--)
{
cout<<(*pa>>i & )<<(i==||i=?"-":"");
}
cout<<"\n";
system("pause");
}
**
三、C-串與string
**
3.1、C-串
C-串的空間長度為字元串長度家1.如果要将C-串放入字元數組,則元素個數非比字元數多1不可。例如:
3.2、字元指針與字元數組
指針式表示記憶體空間位置的類型。字元指針就是所指向的空間位置上的值,當作字元來操作的類型。
3.3、C-串操作
#include<iostream>
#include<string>
using namespace std;
int main()
{
char* s1 = "Hello";
char* s2 = "123";
char a[];
strcpy(a,s1); //複制
cout<<(strcmp(a,s1)== ? "" :"not")<<"equal\n"; //比較
cout<<strcat(a,s2)<<endl; //連接配接
cout<<strrev(a)<<endl; //倒置
cout<<strset(a,'c')<<endl; //設定
cout<<(strstr(s1,"ell")? "" :"not")<<"found\n"; //查找串
cout<<(strchr(s1,'c') ? "" : "not")<<"found\n"; //查找字元
system("pause");
}
3.4、string
string是一種自定義的類型,它可以友善地執行C-串所不能執行的一切操作。它處理空間占用問題是自動的,需要多少,用多少。它可從C-串轉換得到,還可以從内部“提煉”出C-串
。
由于字元指針所指向的空間受認為操作的控制,是以它會導緻許多程式設計中的低級錯誤。
3.5、string與C-串的輸入與輸出
getline的使用
3.6、string流
若有一個檔案aaa.txt,有若幹行,不知道每行中含有幾個整數,要變成輸出每行的整數和
#include<iostream>
#include<sstream>
#include<fstream>
using namespace std;
int main()
{
ifstream in("aaa.txt");
for (string s; getline(in, s);)
{
int a, sum=;
for(istringstream sin(s); sin>>a; sum += a);
cout<<sum<<endl;
}
system("pause");
}
getline(istream &in, string &s)
從輸入流讀入一行到string s
•功能:
–從輸入流中讀入字元,存到string變量
–直到出現以下情況為止:
•讀入了檔案結束标志
•讀到一個新行
•達到字元串的最大長度
–如果getline沒有讀入字元,将傳回false,可用于判斷檔案是否結束
3.7、數組(arrays)
下面這段代碼的數組定義是錯誤的
int n=;
int a[n]; //錯:數組元素個數必須是常量
正确的定義應為如下所示
const int n=100;
int a[n];
3.8、初始化(initialization)
隻要使用了花括号,就是實施了初始化。對于實施初始化的數組,如果初試個數不足等号左邊方括号中規定的元素個數,則後面的元素值全為0.具有初始化的數組定義,其元素個數可以省略,這是,最後确定的元素個數取決于初始化的個數。
字元數組的初始化形式
3.9、預設值(default value)
對于沒有初始化的數組,分兩種情況:
一種是全局數組和靜态數組,也就是在函數外部定義的,或者加上static修飾的數組定義,其元素總是全被清0;
另一種是局部數組,就是在函數内部定義的數組,他們的值是不确定的。
#include<iostream>
using namespace std;
int array1[]={,,}; //有初始化
int array2[]; //無初始化
int main ()
{
int array3[]={}; //有初始化
int array4[]; //無初始化
cout<<"array1:";
for (int i=; i<; ++i)
cout<<array1[i]<<" ";
cout<<"\narray2:";
for (int i=; i<; ++i)
cout<<array2[i]<<" ";
cout<<"\narray3:";
for (int i=; i<; ++i)
cout<<array3[i]<<" ";
cout<<"\narray4:";
for (int i=; i<; ++i)
cout<<array4[i]<<" ";
cout<<"\n";
system("pause");
}
3.10、二維數組
int a[3][5]; //定義二維數組
int a[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; //初始化二維數組
3.11、向量(Vectors)
vector是響亮類型,它是一種對象屍體,具有值,是以可以看作是變量。它可以容納許多其他類型的相同實體,如若幹個整數,是以稱其為容器。
使用它時,隻用包含頭檔案vector即可。
要輸出向量中所有元素,可以有兩種循環控制方式:
int a[]={,,,,,,};
vector<int> va(a,a+);
for (int i=; i<va.size(); ++i) //第一種
cout<<va[i]<<" ";
for(vector<int>::iterator it=va.begin(); it!=va.end();++it) //第二種
cout<<*it<<" ";
第一種形式是下标方式,a[i]是向量元素操作,這種形式與數組一樣;第二種形式是周遊器方式,*it是指針間訪形式,它的意義是it所指向的元素值。
va.size()是向量中元素的個數,va.begin()表示向量的第一個元素,這種操作方式是一個對象捆綁一個函數調用 。
向量中的操作都是通過使用成員函數來完成的。它的常用操作有:
3.12、添加元素
讀入一個檔案aaa.txt的資料到向量中,檔案中為一些整數。要判斷向量中的元素有多少個兩兩相等的數對。
ifstream in ("aaa.txt");
vector<int> s;
for(int a; in>>a;)
s.push_back(a);
int pair=;
for(int i=; i<s.size()-; ++i)
for(int j=i+; j<s.size(); ++j)
if (s[i]==s[j])
pair++;
cout<<pair<<"\n";
3.13、二維向量
在二位向量中,可以使用vector中的swap操作來交換兩個向量。
viod swap(vector<int>& a, vector<int>& b)
{
vector<int> temp =a; a=b; b=temp;
}
若幹個向量按長短排序
//若幹個向量按長短排序
#include<iostream>
#include<vector>
#include<sstream>
#include<fstream>
using namespace std;
typedef vector<vector<int>> Mat;
Mat input();
void mySort(Mat& a);
void print(const Mat& a);
int main()
{
Mat a = input();
mySort(a);
print(a);
system("pause");
}
Mat input()
{
ifstream in("aaa.txt");
Mat a ;
for(string s; getline(in, s);)
{
vector<int> b;
istringstream sin(s);
for(int ia; sin>>ia;)
b.push_back(ia);
a.push_back(b);
}
return a ;
}
void mySort(Mat& a)
{
for(int pass=; pass<a.size(); ++pass)
for(int i=; i<a.size()-pass; ++i)
if (a[i+].size()<a[i].size())
a[i].swap(a[i+]);
}
void print (const Mat& a)
{
for (int i=; i<a.size(); ++i)
{
for(int j=; j<a[i].size(); ++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
}