中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

培訓(xùn)的網(wǎng)站建設(shè)互聯(lián)網(wǎng)營銷師證書是國家認(rèn)可的嗎

培訓(xùn)的網(wǎng)站建設(shè),互聯(lián)網(wǎng)營銷師證書是國家認(rèn)可的嗎,建設(shè)工程竣工竣工檔案網(wǎng)站,南京做網(wǎng)站建設(shè)的公司哪家好其他庫 C 還提供了其他一些類庫,它們比本章討論前面的例子更為專用。例如,頭文件 complex 為復(fù)數(shù)提供了類模板 complex,包含用于 float、long 和 long double 的具體化。這個類提供了標(biāo)準(zhǔn)的復(fù)數(shù)運(yùn)算及能夠處理復(fù)數(shù)的標(biāo)準(zhǔn)函數(shù)。C11 新增的頭文…

其他庫

C++ 還提供了其他一些類庫,它們比本章討論前面的例子更為專用。例如,頭文件 complex 為復(fù)數(shù)提供了類模板 complex,包含用于 float、long 和 long double 的具體化。這個類提供了標(biāo)準(zhǔn)的復(fù)數(shù)運(yùn)算及能夠處理復(fù)數(shù)的標(biāo)準(zhǔn)函數(shù)。C++11 新增的頭文件 random 提供了更多的隨機(jī)數(shù)功能。

第14章介紹了頭文件 valarry 提供的模板類 valarray。這個類模板被設(shè)計(jì)成用于表示數(shù)值數(shù)組,支持各種數(shù)值數(shù)組操作,例如將兩個數(shù)組的內(nèi)容相加、對數(shù)組的每個元素應(yīng)用數(shù)學(xué)函數(shù)以及對數(shù)組進(jìn)行線性代數(shù)運(yùn)算。

vector、valarray 和 array

你可能會問,C++ 為何提供三個數(shù)組模板:vector、valarray 和 array。這些類是由不同的小組開發(fā)的,用于不同的目的。vector 模板類是一個容器類和算法系統(tǒng)的一部分,它支持面向容器的操作,如排序、插入、重新排列、搜索、將數(shù)據(jù)轉(zhuǎn)移到其他容器中等。而 valarray 類模板是面向數(shù)值計(jì)算的,不是 STL 的一部分。例如,它沒有 push_back() 和 insert() 方法,但為很多數(shù)學(xué)運(yùn)算提供了一個簡單、直觀的接口。最后 array 是為替代內(nèi)置數(shù)組而設(shè)計(jì)的,它通過提供更好、更安全的接口,讓數(shù)組更緊湊,效率更高。Array 表示長度固定的數(shù)組,因此不支持 push_back() 和 insert(),但提供了多個 STL 方法,包括 begin()、end()、rbegin() 和 rend(),這使得很容易將 STL 算法用于 array 對象。

例如,假設(shè)有如下聲明:

vector<double> vedl(10), ved2(10), ved3(10);
array<double, 10> vod1, vod2, vod3;
valarray<double> vad1(10), vad2(10), vad3(10);

同時,假設(shè) ved1、ved2、vod1、vod2、vad1 和 vad2 都有合適的值。要將兩個數(shù)組中第一個元素的和賦給第三個數(shù)組的第一個元素,使用 vector 類時,可以這樣做:

transform(ved1.begin(), ved1.end(), ved2.begin(),, ved3.begin(), plus<double>() );

對于 array 類,也可以這樣做:

transfrom(vod1.begin(), vod1.end(), vod2.begin(), vod3.begin(), plus<double>() );

然而,valarray 類重載了所有算術(shù)運(yùn)算符,使其能夠用于 valarray 對象,因此您可以這樣做:

vad3 = vad1 + vad2;	// + overloaded

要將數(shù)組中每個元素的值擴(kuò)大 2.5 倍,STL 方法如下:

transform(ved3.begin(), ved3.end(), ved3.begin(), bind1st(multiplies<double>(), 2.5) );

valarray 類重載了將 valarray 對象乘以一個值的運(yùn)算符,還重載了各種組合賦值運(yùn)算符,因此可以采取下列兩種方法之一:

vad3 = 2.5 * vad3;		// * overloaded
vad3 *= 2.5;			// *= overloaded

假設(shè)您要計(jì)算數(shù)組中每個元素的自然對數(shù),并將計(jì)算結(jié)果存儲到另一個數(shù)組的相應(yīng)元素中,STL 方法如下:

transform(ved1.begin(), ved1.end(), ved3.begin(), log);

valarray 類重載了這種數(shù)學(xué)函數(shù),使之接受一個 valarray 參數(shù),并返回一個 valarray 對象,因此您可以這樣做:

vad3 = log(vad1);		// log() overloaded

也可以使用 apply() 方法,該方法也適用于非重載函數(shù):

vad3 = vad1.apply(log);

方法 apply() 不修改調(diào)用對象,而是返回一個包含結(jié)果的新對象。
執(zhí)行多步計(jì)算時,valarray 接口的簡單性將更為明顯:

vad3 = 10.0 * ( (vad1 + vad2) / 2.0 + vad1 * cos(vad2) );

有關(guān)使用 STL vector 來完成上述計(jì)算的代碼留給您去完成。
valarray 類還提供了方法 sum()(計(jì)算 valarray對象中所有元素的和)、size() (返回元素?cái)?shù))、max()(返回最大的元素值)和 min() (返回最小的元素值)。

正如您看到的,對于數(shù)學(xué)運(yùn)算而言,valarray 類提供了比 vector 更清晰的表示方式,但通用性更低。valarray 類確實(shí)有一個 resize() 方法,但不能像使用 vector 的 push_back 時那樣自動調(diào)整大小。沒有支持插入、排序、搜索等操作的方法??傊?#xff0c;與 vector 類相比,valarray 類關(guān)注的東西更少,但這使得它的接口更簡單。

valarray 的接口更簡單是否意味著性能更高呢?在大多數(shù)情況下,答案是否定的。簡單表示法通常是使用類似于您處理常規(guī)數(shù)組時使用的循環(huán)實(shí)現(xiàn)的。然而,有些硬件設(shè)計(jì)允許在執(zhí)行 vector 操作時,同時將一個數(shù)組中的值加載到一組寄存器中,然后并行地進(jìn)行處理。從原則上說,valarray 操作也可以實(shí)現(xiàn)成利用這樣的設(shè)計(jì)。

可以將 STL 功能用于 valarray 對象嗎?通過回答這個問題,可以快速地復(fù)習(xí)一些 STL 原理。假設(shè)有一個包含 10 個元素的 valarray<double> 對象:

valarray<double> vad(10);

使用數(shù)字填充該數(shù)組后,能夠?qū)?STL sort() 函數(shù)用于該數(shù)組嗎?valarray 類沒有 begin() 和 end() 方法,因此不能將它們用作指定區(qū)間的參數(shù):

sort(vad.begin(), vad.end()); // NO, no begin(), end()

另外,vad 是一個對象,而不是指針,因此不能像處理常規(guī)數(shù)組那樣,使用 vad 和 vad + 10 作為區(qū)間參數(shù),即下面的代碼不可行:

sort(vad, vad + 10);	// NO, vad an object, not an address

可以使用地址運(yùn)算符:

sort(&vad[0], &vad[10]);	// maybe?

但 valarray 沒有定義下標(biāo)超過尾部一個元素的行為。這并不意味著使用 &vad[10] 不可行。事實(shí)上,使用 6 中編譯器測試上述代碼時,都是可行的;但這確實(shí)意味著可能不可行。為讓上述代碼不可行,需要一個不太可能出現(xiàn)的條件,如讓數(shù)組與預(yù)留給堆的內(nèi)存塊相鄰。然而,如果 3.85 億的交易金命懸與您的代碼,您可能不想冒代碼出現(xiàn)問題的風(fēng)險(xiǎn)。

為解決這種問題,C++11 提供了接受 valarray 對象作為參數(shù)的模板函數(shù) begin() 和 end()。因此,您將使用 begin(vad) 而不是 vad.begin。這些函數(shù)返回的值滿足 STL 區(qū)間需求:

sort(begin(vad), end(vad) ); 	// C++11 fix!

下面的程序演示了 vector 和 valarray 類各自的優(yōu)勢。它使用 vector 的 push_back() 方法和自動調(diào)整大小的功能來收集數(shù)據(jù),然后對數(shù)字進(jìn)行排序后,將它們從 vector 對象復(fù)制到一個同樣大小的 valarray 對象中,再執(zhí)行一些數(shù)學(xué)運(yùn)算。

// valvect.cpp -- comparing vector and valarray#include <ios>
#include<iostream>
#include<valarray>
#include<vector>
#include<algorithm>int main() {using namespace std;vector<double> data;double temp;cout << "Enter numbers (<=0 to quit):\n";while(cin >> temp && temp > 0){data.push_back(temp);}sort(data.begin(), data.end());int size = data.size();valarray<double> numbers(size);int i;for(i=0; i<size; i++){numbers[i] = data[i];}valarray<double> sq_rts(size);sq_rts = sqrt(numbers);valarray<double> results(size);results = numbers + 2.0 * sq_rts;cout.setf(ios_base::fixed);cout.precision(4);for (i=0; i< size; i++){cout.width(8);cout << numbers[i] << ": ";cout.width(8);cout << results[i] << endl;}cout << "done\n";return 0;
}

下面是程序的運(yùn)行情況:

Enter numbers (<=0 to quit):
3.3 1.8 5.2 10 14.4 21.6 26.9 01.8000:   4.48333.3000:   6.93325.2000:   9.760710.0000:  16.324614.4000:  21.989521.6000:  30.895226.9000:  37.2730
done

除前面討論的外,valarray 類還有很多其他特性。例如,如果 numbers 是一個 valarray<double> 對象,則下面的語句將創(chuàng)建一個 bool 數(shù)組,其中 vbool[i] 被設(shè)置為 numbers[i] > 9 的值,即 true 或 false:

valarray<bool> vbool = numbers > 9;

還有擴(kuò)展的下標(biāo)指定版本,來看其中的一個——slice 類。slice 類對象可用作數(shù)組索引,在這種情況下,它表的不是一個值而是一組值。slice 對象被初始化為三個整數(shù)值:起始索引、索引數(shù)和跨距。起始索引是第一個被選中的元素的索引,索引數(shù)指出要選擇多少個元素,跨距表示元素之間的間隔。例如,slice(1,4,3) 創(chuàng)建的對象標(biāo)識選擇 4 個元素,它們的索引分別是1、4、7、10。也就是說,從起始索引開始,加上跨距得到下一個元素的索引,依此類推,直到選擇了 4 個元素。如果 varint 是一個 valarray<int>對象,則下面的語句將把第1、4、7、10個元素都設(shè)置為10:

varint[slice(1,4,3)] = 10;		// set selected elements to 10

這種特殊的下標(biāo)指定功能讓您能夠使用一個一維 valarray 對象來表示二維數(shù)據(jù)。例如,假設(shè)要表示一個4行3列的數(shù)組,可以將信息存儲在一個包含12個元素的valarray對象中,然后使用一個 slice(0,3,1)對象作為下標(biāo),來表示元素0、1、2,即第1行。同樣,下標(biāo) slice(0,4,3)表示元素0、3、6、9,即第一列。下面的程序演示了 slice 的一些特性。

// vslice.cpp -- using valarray slices
#include<iostream>
#include<valarray>
#include<cstdlib>const int SIZE = 12;
typedef std::valarray<int> vint;        // simplify declaratrions
void show(const vint & v, int cols);int main(){using std::slice;       // from <valarray>using std::cout;vint valint(SIZE); // think of as 4 rows of 3int i;for (i=0; i < SIZE; i++){valint[i] = std::rand()%10;}cout << "Original array:\n";show(valint, 3);        // show in 3 columnsvint vcol(valint[slice(1,4,3)]); // extract 2nd columncout << "Second column:\n";show(vcol, 1);          // show in 1 columnvint vrow(valint[slice(3,3,1)]);    // extract 2nd rowcout << "Second row:\n";show(vrow, 3);valint[slice(2,4,3)] = 10;      // assign 10 to 3 columncout << "Set last column to 10:\n";show(valint, 3);cout << "Set first column to sum of next two:\n";// + not defined for slices, so convert to valarray<int>valint[slice(0,4,3)] = vint(valint[slice(1,4,3)]) + vint(valint[slice(2,4,3)]);show(valint, 3);return 0;
}void show(const vint & v, int cols){using std::cout;using std::endl;int lim = v.size();for (int i = 0; i < lim; i++){cout.width(3);cout << v[i];if(i%cols == cols -1 )cout << endl;elsecout << ' ';}if(lim%cols!=0)cout << endl;
}

對于 valarray 對象(如 valint)和單個 int 元素(如 valint[1]),定義了運(yùn)算符++;但正如程序指出的,對于使用 slice 下標(biāo)指定的 valarray 單元,如 valint[slice(1,4,3)],并沒有定義運(yùn)算符+。因此程序使用 slice 指定的元素創(chuàng)建一個完整的 valint 對象,以便能夠執(zhí)行加法運(yùn)算:

vint(valint[slice(1,4,3)]) 	// calls a slice-based constructor

valarray 類提供了用于這種目的的構(gòu)造函數(shù)。
下面是該程序的運(yùn)行情況:

Original array:1   7   40   9   48   8   24   5   5
Second column:7985
Second row:0   9   4
Set last column to 10:1   7  100   9  108   8  104   5  10
Set first column to sum of next two:17   7  1019   9  1018   8  1015   5  10

由于元素值是使用 rand() 設(shè)置的,因此不同的 rand() 實(shí)現(xiàn)將設(shè)置不同的值。
另外,使用 gslice 類可以表示多維下標(biāo),但上述內(nèi)容應(yīng)足以讓您對 valarray 有一定的了解。

模板 initializaer_list(C++11)

模板 initializer_list 是 C++11 新增的。您可使用初始化列表語法將 STL 容器初始化為一系列值:

std::vector<double> payments { 45.99, 39.23, 19.95, 89.01};

這將創(chuàng)建一個包含 4 個元素的容器,并使用列表中的 4 個值來初始化這些元素。這之所以可行,是因?yàn)槿萜黝惉F(xiàn)在包含將 initializer_list<T> 作為參數(shù)的構(gòu)造函數(shù)。例如,vector<double> 包含一個將 initializer_list<double> 作為參數(shù)的構(gòu)造函數(shù),因此上述聲明與下面的代碼等價(jià):

std::vector<double> payments({45.99, 39.23, 19.95, 89.01});

這里顯式地將列表指定為構(gòu)造函數(shù)參數(shù)。

通常,考慮到 C++11 新增的通用初始化語法,可使用表示法{} 而不是 () 來調(diào)用類構(gòu)造函數(shù):

shared_ptr<double> pd {new double}; // ok to use {} instead of ()

但如果類也有接受 initializer_list 作為參數(shù)的構(gòu)造函數(shù),這將帶來問題:

std::vector<int> vi{10}; // ??

這將調(diào)用哪個構(gòu)造函數(shù)呢?

std::vector<int> vi(10);		// case A: 10 uninitialized elements
std::vector<int> vi({10});		// case B: 1 element set to 10

答案是,如果類有接受 initializer_list 作為參數(shù)的構(gòu)造函數(shù),則使用語法 {} 將調(diào)用該構(gòu)造函數(shù)。因此,在這個示例中,對應(yīng)的是情形 B。

所有 initializer_list 元素的類型都必須相同,但編譯器將進(jìn)行必要的轉(zhuǎn)換:

std::vector<double> payments {45.99, 39.23, 19, 89};
// same as std::vector<double> payments { 45.99, 39.23, 19.0, 89.0 };

在這里,由于 vector 的元素類型為 double,因此列表的類型為 initializer_list<double>,所以 19 和 89 將被轉(zhuǎn)換為 double。

但不能進(jìn)行隱式的縮窄變換:

std::vector<int> values = {10, 8, 5.5 }; // narrowing, compile-time error

在這里,元素類型為 int,不能隱式地將 5.5 轉(zhuǎn)換為 int。
除非類要用于處理長度不同的列表,否則讓它提供接受 initializer_list 作為參數(shù)地構(gòu)造函數(shù)沒有意義。例如,對于存儲固定數(shù)目值得類,您不想提供接受 initializer_list 作為參數(shù)的構(gòu)造函數(shù)。在下面的聲明中,類包含三個數(shù)據(jù)成員,因此沒有提供 Initializer_list 作為參數(shù)的構(gòu)造函數(shù):

class Position {
private:int x;int y;int z;
public:Position(int xx = 0, int yy = 0, int zz = 0 ): x(xx), y(yy), z(zz) {}// no initializer_list constructor...
};

這樣,使用語法 {} 時將調(diào)用構(gòu)造函數(shù) Position(int, int, int):

Position A = {20, -3};		// uses Position(20,-3,0);

使用 initializer_list

要在代碼中使用 initializer_list 對象,必須包含頭文件 initializer_list。這個模板類包含成員函數(shù) begin() 和 end(),您可使用這些函數(shù)來訪問列表元素。它還包含成員函數(shù) size(),該函數(shù)返回元素?cái)?shù)。下面的程序時一個簡單的 Initializer_list 使用示例,它要求編譯器支持 C++11 新增的 initializer_list。

// ilist.cpp -- use initializer_list (C++111 feature)#include<iostream>
#include<initializer_list>double sum(std::initializer_list<double> il);
double average(const std::initializer_list<double> & ril);int main(){using std::cout;cout << "List 1: sum = " << sum({2, 3, 4})<< ", ave = " << average({2, 3, 4}) << '\n';std::initializer_list<double> dl = {1.1, 2.2, 3.3, 4.4, 5.5};cout << "List 2: sum = " << sum(dl)<< ", ave = " << average(dl) << '\n';dl = {16.0, 25.0, 36.0, 46.0, 64.0};cout << "List 3: sum = " << sum(dl)<< ", ave = " << average(dl) << '\n';return 0;}double sum(std::initializer_list<double> il){double tot = 0;for (auto p = il.begin(); p != il.end(); p++){tot += *p;}return tot;
}double average(const std::initializer_list<double> & ril){double tot = 0;int n = ril.size();double ave = 0.0;if (n>0) {for (auto p = ril.begin(); p!=ril.end(); p++){tot += *p;}ave = tot / n;}return ave;
}

該程序的輸出如下:

List 1: sum = 9, ave = 3
List 2: sum = 16.5, ave = 3.3
List 3: sum = 187, ave = 37.4

可按值傳遞 initializer_list 對象,也可按引用傳遞,如 sum() 和 average() 所示。這種對象本身很小,通常是兩個指針(一個指向開頭,一個指向末尾的下一個元素),也可能是一個指針和一個表示元素?cái)?shù)的整數(shù),因此采用的傳遞方式不會帶來重大的性能影響。STL 按值傳遞它們。

函數(shù)參數(shù)可以是 initializer_lit 字面量,如 {2, 3, 4},也可以是 initializer_list 變量,如 dl。
initializer_list 的迭代器類型為 const,因此您不能修改 initializer_list 中的值:

*dl.begin() = 2011.6;	// not allowed

然而,提供 initialzier_list 類的初衷旨在讓您能夠?qū)⒁幌盗兄祩鬟f給構(gòu)造函數(shù)或其他函數(shù)。

http://www.risenshineclean.com/news/4355.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)模式acca少女網(wǎng)課視頻
  • 專做旅游酒店特價(jià)網(wǎng)站關(guān)鍵詞提取工具app
  • 關(guān)于政府網(wǎng)站建設(shè)的講話南寧網(wǎng)站快速排名提升
  • 中港建設(shè)集團(tuán)有限公司網(wǎng)站seo范疇
  • 網(wǎng)站建設(shè)中通知網(wǎng)上推廣平臺
  • 網(wǎng)站建設(shè)鼠標(biāo)滑動效果網(wǎng)站優(yōu)化就是搜索引擎優(yōu)化
  • 合伙做網(wǎng)站怎么分配股權(quán)百度快速收錄接口
  • 中國建設(shè)網(wǎng)站首頁sem掃描電鏡是測什么的
  • 關(guān)于網(wǎng)站制作整站優(yōu)化工具
  • 個人做商城網(wǎng)站大概多少錢2021百度新算法優(yōu)化
  • 中學(xué)生網(wǎng)站作品免費(fèi)seo免費(fèi)培訓(xùn)
  • 校園文化建設(shè)網(wǎng)站素材西安排名seo公司
  • 免費(fèi)下載ppt模板網(wǎng)站哪個好免費(fèi)網(wǎng)站模板庫
  • 做充幣提現(xiàn)的網(wǎng)站優(yōu)化大師怎么卸載
  • 網(wǎng)站建設(shè)套餐價(jià)格已備案域名交易平臺
  • 51做網(wǎng)站廣州2022最近的新聞大事10條
  • 讓自己的電腦做網(wǎng)站的服務(wù)器營銷軟文是什么意思
  • 珠海建站公司什么是搜索引擎優(yōu)化推廣
  • 網(wǎng)站系統(tǒng)下載不了文件百度代理服務(wù)器
  • 做的好的電商網(wǎng)站項(xiàng)目如何自己創(chuàng)建網(wǎng)站
  • 網(wǎng)站設(shè)計(jì)做哪些的百度軟件
  • 網(wǎng)站建設(shè)流程域名申請?jiān)扑阉飨螺d
  • 愛做網(wǎng)站免費(fèi)模板vip北京優(yōu)化網(wǎng)站公司
  • 網(wǎng)站建設(shè)創(chuàng)業(yè)基礎(chǔ)ppt模板電商seo是什么意思啊
  • 網(wǎng)站建設(shè)應(yīng)該學(xué)什么軟件域名查詢ip網(wǎng)站
  • 四川旅游網(wǎng)站設(shè)計(jì)論文全網(wǎng)營銷外包
  • 購物網(wǎng)站開發(fā)設(shè)計(jì)思路廣州市口碑seo推廣
  • 菏澤網(wǎng)站建設(shè)公司有哪些百度公司地址在哪里
  • 雷州網(wǎng)站建設(shè)公司百度app下載官方免費(fèi)最新版
  • 設(shè)計(jì)漂亮的網(wǎng)站廣州權(quán)威發(fā)布