2014-02-07 2 views
0

У меня есть std :: vector Я хочу перезаписать новые элементы, которые сделают его более крупным. Какой способ был бы самым быстрым/наиболее эффективным для памяти способом? Вот моя наивная реализация:Самый эффективный способ переписать вектор с большим

#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

мелкийVec.reserve (большойVecSize); может зарезервировать достаточно места для новых элементов.

попробовать этот код:

#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 просто скопируйте адрес в другой, не копируйте объект указателя.

Смежные вопросы