STL:使用string、vector、complex和limits
?(有少量修改!)使用到了STL的算法庫:
#include<algorithm>
#include<vector> //屬于STL庫 模板庫?
寫庫的人為了和標準C和C++庫區分開?
所有的模板庫的文件都沒有后綴?
一般如 #include <iostream.h>?
模板庫中 #include <iostream>
Tips:在GCC下,除了要用#include <vector>外,還要加一句?unsing namespace std;才能直接使用vector<int>,否則的話,用?std::vector<int> xxx;也可以。
要引入名字空間?
方法有三個:?
1, using namespace std;?
2, using std::vector;?
前兩個方法放在cpp文件頭 ,h的頭也可以!
3,樓上那樣,在每個地方用: std::vector<int> xx;
C++標準庫大量使用了模板。盡管使用模板進行編碼并不是必要的,但是使用模板代碼卻是非常重要的(可以節省大量代碼)。本節討論由C++標準庫和STL提供的一些有用的模板類型。充分利用STL非常重要,這也是第7章討論的主題。
1.1.1 string和basic_string<>
string庫是一個涵蓋非常廣泛的庫,它使用模板創建了一系列字符串類型。使用字符串時,在string庫和cstring庫中,應該優先考慮string庫,原因是cstring是舊的C標準庫提供的char*字符串。
將string作為一個類型使用非常簡單,它實際上是一個專門包含類型char的基本容器類型。事實上,string是使用char類型實例化的模板basic_string <char T>,basic_ string<> 模板也可以用于存儲寬字符類型wchar_t,這在ASCII字符集不能完全表示所需的字符集時很有用,例如漢語、日語、芬蘭語或者韓國語這些語言。 basic_string<>類表示一個字符序列,它包含了順序容器的所有常用操作,以及標準的字符串操作,例如拼接。
因為類型string和wstring是分別使用basic_string<char>和basic_string<wchar_t>進行的typedef,所以不需要直接使用模板basic_string<>。
下面的例子說明了string類型的一些特點。
文件 templateString.cpp
// String class to rewrite a sentence.
#include <iostream>
#include <string>
using namespace std;
int main()
{
?? string sentence, words[10];
?? int pos = 0, old_pos = 0, nwords, i = 0;
?? sentence = "Eskimos have 23 ways to ";
?? sentence += "describe snow";
?? while (pos < sentence.size()) {
????? pos = sentence.find(' ', old_pos);
????? words[i].assign(sentence, old_pos,
????????????????????? pos - old_pos);
????? cout << words[i++] << endl; ???????????????? // print words
????? old_pos = pos + 1;
?? }
?? nwords = i;
?? sentence = "C++ programmers ";
?? for (i = 1; i < nwords -1; ++i)
?? sentence += words[i] + ' ';
?? sentence += "windows";
?? cout << sentence << endl;
}
string類型用于從一個句子中捕獲一個個單詞,最初這個句子中的每個單詞都由空格符分隔。空格符的位置通過成員函數find()計算得出,然后成員函數assign()從sentence中選擇一個子串。最后,使用重載函數operator=()、 operator+=()和operator+()進行賦值和拼接,創建出一個新的句子。
注意,檢查本地系統的文檔非常重要,不同的廠商都提供了自己的實現規范。
1.1.2 標準模板庫中的vector<>
我們開發了一個通用的類似數組的容器vector<>。完整的 std::vector<>由標準模板庫vector提供。在多數情況下,最好使用vector類型代替基本數組類型,原因是:vector 檢查數組是否越界,所以比基本數組更安全;vector能夠重新分配數組長度并且有許多相關的標準方法,所以比基本數組更靈活;vector的表示與普通數組一樣,所以很容易就可以取代基本數組。下面是一個示例:
#include <vector>
using namespace std;
template<class T>
T* find(vector<T> data, T v)
{
?? int i;
?? for (i = 0; i < data.size(); i++)
????? if (data[i] == v);
???????? return &data[i];
????? return 0; ???????????????????????? // indicates failure to find v
}
注意,上述代碼看上去就像是使用了典型的數組,唯一例外的是size()方法返回了vector的長度。
1.1.3 使用complex<>
complex庫中的模板complex<>提供了一個復數類型,它與其他數值類型兼容。在早期的C++庫中,complex并不是一個模板,它只是基于下列數據描述的一種類型:
class complex{
?? // ……methods
private:
?? double x, y;
};
現在complex則由以下模板描述:
template <class SCALAR>
class complex{
?? // ……methods
private:
?? SCALAR x, y;
};
這使用戶能夠根據需要決定基本類型的精度。一般來說,這些基本類型是float、double或者long double。下面是用于測試這個類型的簡單代碼。
文件 complex.cpp
#include <iostream>
#include <complex>
using namespace std;
int main()
{
?? complex<double> x(1,2.1), y;
?? cout << "x = " << x << endl;
?? y = x + 1.0;
?? cout << "\ny = " << y << endl;
?? // if (x < y) not allowed - no standard definition
?? //?? cout << "x less than y" << endl;
}
complex類型對科學家和工程師來說很重要,它說明了將C++擴展到新的領域是多么容易的事情。例如,許多科學家使用FORTRAN90編程,原因就是FORTRAN90中有復數類型。因此,C++實際上已經能夠取代需要復數類型的FORTRAN程序。
注意注釋掉的行是如何使用小于運算符的。在標準庫中沒有為complex類型定義該運算符,所以在對該模板實例化時編譯將失敗。如果讀者自己定義了這個運算符,可以重載該運算符,運行上述代碼。
1.1.4 limits和其他有用的模板
limits庫描述了本地系統上的各種基礎類型的特性,它通過模板類 numberic_limits<>為所有的數值類型提供了相應的屬性信息。在傳統的C語言方法中,每一種數據類型的屬性都由唯一的宏標識符表示,例如INT_MAX表示本地系統的最大int型值。而在模板類numeric_limits<>中則定義了一個靜態函數max()用于返回相應的屬性值,例如numeric_ limits<int>::max()返回本地系統的最大int型值。使用模板類可以大大減少用于描述本地系統的符號名的數量。
下面是一個使用numeric_limits<>函數的例子:
文件 limits.cpp
#include <iostream>
#include <limits>
using namespace std;
int main()
{
?? cout << numeric_limits<char>::digits << " char\n ";
?? cout << numeric_limits<unsigned char>::digits << " u char\n";
?? cout << numeric_limits<wchar_t>::digits << " wchar_t\n";
?? cout << numeric_limits<int>::max() << " max int\n";
?? cout << numeric_limits<double>::max() << " max double " << endl;
}
digits域給出當前類型的位數。
總結
以上是生活随笔為你收集整理的STL:使用string、vector、complex和limits的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中班教案《马术表演》
- 下一篇: 游戏开发:OpenGL入门学习