日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL:使用string、vector、complex和limits

發布時間:2023/12/31 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。