STL:使用string、vector、complex和limits
?(有少量修改!)使用到了STL的算法庫:
#include<algorithm>
#include<vector> //屬于STL庫 模板庫?
寫庫的人為了和標(biāo)準(zhǔn)C和C++庫區(qū)分開?
所有的模板庫的文件都沒有后綴?
一般如 #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++標(biāo)準(zhǔn)庫大量使用了模板。盡管使用模板進行編碼并不是必要的,但是使用模板代碼卻是非常重要的(可以節(jié)省大量代碼)。本節(jié)討論由C++標(biāo)準(zhǔn)庫和STL提供的一些有用的模板類型。充分利用STL非常重要,這也是第7章討論的主題。
1.1.1 string和basic_string<>
string庫是一個涵蓋非常廣泛的庫,它使用模板創(chuàng)建了一系列字符串類型。使用字符串時,在string庫和cstring庫中,應(yīng)該優(yōu)先考慮string庫,原因是cstring是舊的C標(biāo)準(zhǔn)庫提供的char*字符串。
將string作為一個類型使用非常簡單,它實際上是一個專門包含類型char的基本容器類型。事實上,string是使用char類型實例化的模板basic_string <char T>,basic_ string<> 模板也可以用于存儲寬字符類型wchar_t,這在ASCII字符集不能完全表示所需的字符集時很有用,例如漢語、日語、芬蘭語或者韓國語這些語言。 basic_string<>類表示一個字符序列,它包含了順序容器的所有常用操作,以及標(biāo)準(zhǔn)的字符串操作,例如拼接。
因為類型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類型用于從一個句子中捕獲一個個單詞,最初這個句子中的每個單詞都由空格符分隔。空格符的位置通過成員函數(shù)find()計算得出,然后成員函數(shù)assign()從sentence中選擇一個子串。最后,使用重載函數(shù)operator=()、 operator+=()和operator+()進行賦值和拼接,創(chuàng)建出一個新的句子。
注意,檢查本地系統(tǒng)的文檔非常重要,不同的廠商都提供了自己的實現(xiàn)規(guī)范。
1.1.2 標(biāo)準(zhǔn)模板庫中的vector<>
我們開發(fā)了一個通用的類似數(shù)組的容器vector<>。完整的 std::vector<>由標(biāo)準(zhǔn)模板庫vector提供。在多數(shù)情況下,最好使用vector類型代替基本數(shù)組類型,原因是:vector 檢查數(shù)組是否越界,所以比基本數(shù)組更安全;vector能夠重新分配數(shù)組長度并且有許多相關(guān)的標(biāo)準(zhǔn)方法,所以比基本數(shù)組更靈活;vector的表示與普通數(shù)組一樣,所以很容易就可以取代基本數(shù)組。下面是一個示例:
#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
}
注意,上述代碼看上去就像是使用了典型的數(shù)組,唯一例外的是size()方法返回了vector的長度。
1.1.3 使用complex<>
complex庫中的模板complex<>提供了一個復(fù)數(shù)類型,它與其他數(shù)值類型兼容。在早期的C++庫中,complex并不是一個模板,它只是基于下列數(shù)據(jù)描述的一種類型:
class complex{
?? // ……methods
private:
?? double x, y;
};
現(xiàn)在complex則由以下模板描述:
template <class SCALAR>
class complex{
?? // ……methods
private:
?? SCALAR x, y;
};
這使用戶能夠根據(jù)需要決定基本類型的精度。一般來說,這些基本類型是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類型對科學(xué)家和工程師來說很重要,它說明了將C++擴展到新的領(lǐng)域是多么容易的事情。例如,許多科學(xué)家使用FORTRAN90編程,原因就是FORTRAN90中有復(fù)數(shù)類型。因此,C++實際上已經(jīng)能夠取代需要復(fù)數(shù)類型的FORTRAN程序。
注意注釋掉的行是如何使用小于運算符的。在標(biāo)準(zhǔn)庫中沒有為complex類型定義該運算符,所以在對該模板實例化時編譯將失敗。如果讀者自己定義了這個運算符,可以重載該運算符,運行上述代碼。
1.1.4 limits和其他有用的模板
limits庫描述了本地系統(tǒng)上的各種基礎(chǔ)類型的特性,它通過模板類 numberic_limits<>為所有的數(shù)值類型提供了相應(yīng)的屬性信息。在傳統(tǒng)的C語言方法中,每一種數(shù)據(jù)類型的屬性都由唯一的宏標(biāo)識符表示,例如INT_MAX表示本地系統(tǒng)的最大int型值。而在模板類numeric_limits<>中則定義了一個靜態(tài)函數(shù)max()用于返回相應(yīng)的屬性值,例如numeric_ limits<int>::max()返回本地系統(tǒng)的最大int型值。使用模板類可以大大減少用于描述本地系統(tǒng)的符號名的數(shù)量。
下面是一個使用numeric_limits<>函數(shù)的例子:
文件 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域給出當(dāng)前類型的位數(shù)。
總結(jié)
以上是生活随笔為你收集整理的STL:使用string、vector、complex和limits的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中班教案《马术表演》
- 下一篇: Monkey框架(测试方法篇)