2014-02-07 39 views
0

我有一個std ::向量我想用新元素覆蓋,這將使它更大。什麼是最快/最有效的記憶方法?這是我的天真執行:最有效的方法來覆蓋一個較大的向量

#include <vector> 

int main() { 
    std::vector<int> smallVec(10, 1); 

    int bigVecSize = 100; 

    smallVec.clear();   
    for(int i = 0; i < bigVecSize; ++i) 
    smallVec.push_back(i); 
} 

是否有任何C++ 11功能可能有所幫助?謝謝。

+1

如果您知道有多少個儲備可能會有所幫助。更多細節可能會有所幫助,因爲您可能不知道細節至關重要。 – Yakk

+0

你能更具體嗎?數據來自哪裏?你想添加到矢量的確切數字是什麼? –

+0

這是一個保證:「...... ***也會讓它變大。」 ? – WhozCraig

回答

1

smallVec.reserve(bigVecSize);可以爲新元素保留足夠的空間。

嘗試此代碼:

#include <vector> 
#include <stdio.h> //for printf() 
#include <stdlib.h> //for system() 
#include <time.h> //for time() & time_t 
int main() { 
    std::vector<int> smallVec(10, 1); 
    int bigVecSize = 1000000; 
    smallVec.reserve(bigVecSize); 
    smallVec.clear(); 

    time_t ts,te; 
    ts=time(NULL); 

    for(int i = 0; i < bigVecSize; ++i) 
    smallVec.push_back(i); 

    te=time(NULL); 
    printf("%ld\n",te-ts); 
} 

使用儲備減少從0.125秒的時間成本來0.087s

在C++ 11如果用戶定義元件用作向量的元素,R值參考可以用來減少複製。

1

對不起,我對C++ 11一無所知。

但是,我認爲通過::memcpy複製內存會更快。

#include <vector> 

void overwrite(std::vector<int>& dst, const std::vector<int>& src) 
{ 
    /* some code - to check the valid of dst and src */ 

    dst.resize(src.size()); 
    ::memcpy(dst.data(), src.data(), sizeof(int) * src.size()); 
} 

int main(int argc, char* argv[]) 
{ 
    // an example 
    std::vector<int> via, vib; 
    via.push_back(22); 
    via.resize(5, 1); 
    vib.push_back(123); 
    vib.resize(10, 2); 
    vib.push_back(123); 
    overwrite(via, vib); 
    return 0; 
} 

std::vector數據存儲器總是隨之而來的,所以你可以從一個std::vector複製到另一個存儲。

注意:當您的std::vector的項目類型是包含一個或多個指針的對象時,您需要注意。由於::memcpy只是將地址複製到另一個地址,因此不要複製指針對象。

相關問題