欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問(wèn)題詳解

 更新時(shí)間:2023年03月30日 11:29:30   作者:renshy5  
c++?vector轉(zhuǎn)數(shù)組是一種將vector容器的元素轉(zhuǎn)換為數(shù)組的方法,主要能幫助提高程序的性能和效率,下面這篇文章主要給大家介紹了關(guān)于C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問(wèn)題的相關(guān)資料,需要的朋友可以參考下

因?yàn)橐恍┰?,本人遇到需要頻繁把vector與數(shù)組之間轉(zhuǎn)換的情況,于是就分析了一下兩個(gè)之間轉(zhuǎn)換的實(shí)施以及相關(guān)的效率問(wèn)題。

數(shù)組轉(zhuǎn)換為vector

眾所周知,一維vector中的元素存儲(chǔ)是順序連續(xù)的,所以我們可以通過(guò)訪問(wèn)第一個(gè)元素的地址以及元素的數(shù)量來(lái)訪問(wèn)一系列的元素。因此,我們可以采取如下操作來(lái)對(duì)vector進(jìn)行訪問(wèn)和轉(zhuǎn)換:

先創(chuàng)造一個(gè)數(shù)組

int array_size = 1000;
double **array = (double **)malloc(sizeof(double *) * array_size);
for (int i = 0; i < array_size; i++)
    array[i] = (double *)malloc(sizeof(double) * array_size);

for (int i = 0; i < array_size; i++)
    for (int j = 0; j < array_size; j++)
        array[i][j] = i * array_size + j;

method1

// method1
vector<vector<double>> t(array_size, vector<double>(array_size));
for (int i = 0; i < array_size; i++)
{
	// 直接定義一個(gè)一維的vector,其首地址為數(shù)組的起始地址,末尾地址為最后的地址。
	t[i] = vector<double>(array[i], array[i] + array_size);
}

method2

// method2
vector<vector<double>> tt(array_size, vector<double>(array_size));
for (int i = 0; i < array_size; i++)
{
	// 直接復(fù)制每一個(gè)值
    for (int j = 0; j < array_size; j++)
        tt[i][j] = array[i][j];
}

method3

vector<vector<double>> ttt(array_size, vector<double>(array_size));
for (int i = 0; i < array_size; i++)
{
	// 直接使用memcpy進(jìn)行復(fù)制
    memcpy(&ttt[i][0], &array[i][0], array_size * sizeof(double));
}

對(duì)于上述的三種方法,我簡(jiǎn)單的對(duì)其進(jìn)行了效率測(cè)試,測(cè)試思路是每個(gè)都循環(huán)執(zhí)行100遍,看每個(gè)方法所需要的時(shí)間,測(cè)試代碼如下:

clock_t begin, end;
double cost;
begin = clock();
for (int x = 0; x < 100; x++)
{
    vector<vector<double>> t(array_size, vector<double>(array_size));
    for (int i = 0; i < array_size; i++)
    {
        t[i] = vector<double>(array[i], array[i] + array_size);
    }
}
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("method 1 cost: %lf secs\n", cost);

// method2
begin = clock();
for (int x = 0; x < 100; x++)
{
    vector<vector<double>> tt(array_size, vector<double>(array_size));
    for (int i = 0; i < array_size; i++)
    {
        for (int j = 0; j < array_size; j++)
            tt[i][j] = array[i][j];
    }
}
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("method 2 cost: %lf secs\n", cost);

// method3
begin = clock();
for (int x = 0; x < 100; x++)
{
    vector<vector<double>> ttt(array_size, vector<double>(array_size));
    for (int i = 0; i < array_size; i++)
    {
        memcpy(&ttt[i][0], &array[i][0], array_size * sizeof(double));
    }
}
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("method 3 cost: %lf secs\n", cost);

多次測(cè)試結(jié)果基本情況如下:

method 1 cost: 0.388440 secs
method 2 cost: 0.726254 secs
method 3 cost: 0.371002 secs

由此可見(jiàn),第三種方法是最快的,不過(guò)和第一種方法差距不大,第二種方法是最差的,所需時(shí)間基本是其他兩種方法的兩倍。

vector轉(zhuǎn)換為數(shù)組

和數(shù)組轉(zhuǎn)換為vector的思路基本一致,因?yàn)橐痪S的數(shù)組的存儲(chǔ)也是連續(xù)隨機(jī)存儲(chǔ)的。

先創(chuàng)造一個(gè)vector:

	int array_size = 1000;
    vector<vector<double>> v(array_size, vector<double>(array_size, 0));
    for (int i = 0; i < array_size; i++)
    {
        for (int j = 0; j < array_size; j++)
        {
            v[i][j] = i * array_size + j;
        }
    }

method1

double **array1 = (double **)malloc(sizeof(double *) * array_size);
// method1 因?yàn)関ector存儲(chǔ)是順序且連續(xù)的,所以可以直接把指向數(shù)組每行首地址的地址指向vector每行的首地址
// 上面那句話有點(diǎn)繞,解釋在最后
for (int i = 0; i < array_size; i++)
{
    array1[i] = &v[i][0];
}

method2

double **array2 = (double **)malloc(sizeof(double *) * array_size);
// method2 直接復(fù)制每一個(gè)值
for (int i = 0; i < array_size; i++)
{
    array2[i] = (double *)malloc(sizeof(double) * array_size);
    for (int j = 0; j < array_size; j++)
    {
        array2[i][j] = v[i][j];
    }
}

method3

double **array = (double **)malloc(sizeof(double *) * array_size);
for (int i = 0; i < array_size; i++)
{
	// method3 使用memcpy來(lái)拷貝數(shù)組的元素
    array[i] = (double *)malloc(sizeof(double) * array_size);
    memcpy(array[i], &v[i][0], sizeof(double) * array_size);
}

效率測(cè)試:因?yàn)槊總€(gè)方法的執(zhí)行都是動(dòng)態(tài)申請(qǐng)內(nèi)存,而作為程序員一定要關(guān)注內(nèi)存,所以每次malloc使用完之后需要free,但是如果按照最開(kāi)始的方法,在同一個(gè)程序內(nèi)每個(gè)執(zhí)行100遍來(lái)測(cè)試時(shí)間的話,可能會(huì)導(dǎo)致因?yàn)槌绦驁?zhí)行到最后因?yàn)閮?nèi)存使用快滿了而導(dǎo)致速度遍慢,于是,我們每個(gè)方法只是執(zhí)行1遍(因?yàn)?遍的內(nèi)存比較?。?,然后比較時(shí)間。

測(cè)試代碼(注意,這里沒(méi)有free,在正式使用的時(shí)候要記得free):

clock_t begin, end;
double cost;

// method1
begin = clock();
double **array1 = (double **)malloc(sizeof(double *) * array_size);
for (int i = 0; i < array_size; i++)
{
    array1[i] = &v[i][0];
}
end = clock();
cost += (double)(end - begin) / CLOCKS_PER_SEC;
printf("method 1 cost: %lf secs\n", cost);

// method2
begin = clock();
double **array2 = (double **)malloc(sizeof(double *) * array_size);
for (int i = 0; i < array_size; i++)
{
    array2[i] = (double *)malloc(sizeof(double) * array_size);
    for (int j = 0; j < array_size; j++)
    {
        array2[i][j] = v[i][j];
    }
}
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("method 2 cost: %lf secs\n", cost);

// method3
begin = clock();
double **array3 = (double **)malloc(sizeof(double *) * array_size);
for (int i = 0; i < array_size; i++)
{
    array3[i] = (double *)malloc(sizeof(double) * array_size);
    memcpy(array3[i], &v[i][0], sizeof(double) * array_size);
}
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("method 3 cost: %lf secs\n", cost);

多次測(cè)試結(jié)果大致如下:

method 1 cost: 0.000006 secs
method 2 cost: 0.007973 secs
method 3 cost: 0.003540 secs

由此可見(jiàn)第一種方法的速度最快,而且遠(yuǎn)遠(yuǎn)塊于其他兩種方法,第二種方法是第三種方法時(shí)間的兩倍。

結(jié)論,直接賦值指針?biāo)俣?gt;使用memcpy>挨個(gè)賦值。

指針與數(shù)組

我們可以看到在上面vector轉(zhuǎn)化為數(shù)組的中,第一種方法比其他快很多,其具體是怎么實(shí)現(xiàn)的呢,解釋如下:

二維數(shù)組的聲明

二維數(shù)組的聲明有幾種方法,下面介紹其中的一種方法:

// 聲明一個(gè)指向指針的指針,有array_size個(gè)這樣的指針。
double **array = (double **)malloc(sizeof(double *) * array_size);
// 每個(gè)指向指針的指針指向一個(gè)一維數(shù)組的首地址,其一維數(shù)組的長(zhǎng)度為array_size。
for (int i = 0; i < array_size; i++)
    array[i] = (double *)malloc(sizeof(double) * array_size);

如上圖所示,array是指向指針的指針,其內(nèi)容為array[0]的地址,而array[0]的內(nèi)容為array[0][0]的地址,array[0][0]的內(nèi)容即為每個(gè)元素的值。

第一種方法的解釋

我們首先聲明一個(gè)指向指針的指針,其長(zhǎng)度為array_size,也就是說(shuō),有array_size個(gè)指針。

然后每個(gè)指針將其內(nèi)容改為每行vector的首地址,這樣就可以訪問(wèn)每個(gè)元素了。

總結(jié)

到此這篇關(guān)于C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問(wèn)題的文章就介紹到這了,更多相關(guān)C++中vector和數(shù)組轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù)

    C語(yǔ)言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù)

    這篇文章主要介紹了C語(yǔ)言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++中友元的實(shí)例詳解

    C++中友元的實(shí)例詳解

    這篇文章主要介紹了C++中友元的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握友元的使用方法,需要的朋友可以參考下
    2017-09-09
  • 有關(guān)C++頭文件的包含順序研究

    有關(guān)C++頭文件的包含順序研究

    下面小編就為大家?guī)?lái)一篇有關(guān)C++頭文件的包含順序研究。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C語(yǔ)言之地址傳遞和引用傳遞的問(wèn)題

    C語(yǔ)言之地址傳遞和引用傳遞的問(wèn)題

    這篇文章主要介紹了C語(yǔ)言之地址傳遞和引用傳遞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • C++ COM編程之什么是組件?

    C++ COM編程之什么是組件?

    這篇文章主要介紹了COM編程之什么是組件?COM組件是以Win32動(dòng)態(tài)鏈接庫(kù)(DLLs)或可執(zhí)行文件(EXEs)的形式發(fā)布的可執(zhí)行代碼,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言基于考研的棧和隊(duì)列

    C語(yǔ)言基于考研的棧和隊(duì)列

    這篇文章主要介紹了考研時(shí)的C語(yǔ)言中的堆棧和隊(duì)列的相關(guān)資料,需要的朋友可以參考下,小編覺(jué)得這篇文章寫(xiě)的很好,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    C語(yǔ)言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    本篇文章是C語(yǔ)言編程篇,主要為大家介紹C語(yǔ)言編程中數(shù)據(jù)在內(nèi)存中存儲(chǔ)解析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • C++實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器

    C++實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器的相關(guān)資料,感興趣的朋友可以參考下
    2016-05-05
  • dword ptr指令詳細(xì)解析

    dword ptr指令詳細(xì)解析

    8086CPU的指令,可以處理兩種尺寸的數(shù)據(jù),byte和word。所以在機(jī)器指令中要指明,指令進(jìn)行的是字操作還是字節(jié)操作
    2013-09-09
  • C++ OpenCV實(shí)現(xiàn)白平衡之灰度世界算法

    C++ OpenCV實(shí)現(xiàn)白平衡之灰度世界算法

    灰度世界算法是白平衡各種算法中最基本的一種。本文將利用C++和OpenCV實(shí)現(xiàn)白平衡中的灰度世界算法,文中示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-05-05

最新評(píng)論