2014-03-21 2 views
2

У меня есть вектор векторного типа std::vector< std::vector< int> > и из этого вектора хочу заполнить std::vector< int>, можете ли вы, пожалуйста, сказать мне эффективный способ сделать это? Там может быть какая-то функция повышения, которую я могу использовать. Я использую VS2010. Ниже фрагмент кода является то, что я пробовал:Что такое эффективный способ заполнения вектора из вектора вектора?

std::vector<std::vector<int> >::iterator outereItr = vecOfVec.begin(); 

while(outereItr != vecOfVec.end()) 
{ 
    std::vector<int>::iterator innerItr1 = (*outereItr).begin(); 
    while(innerItr1 != (*outereItr).end()) 
    { 
     masterVec.push_back(*innerItr1); 
     ++innerItr1; 
    } 
    ++outereItr; 
} 
+0

Вы имеете в виду итерацию по всем подвекторам вектора векторов и заполнение всего одного вектора их содержимым? –

+2

Yo dawg, я слышал, что вам нравятся векторы ... – ElGavilan

ответ

4

Вы можете использовать функцию std::vector::insert.

std::vector<int> masterVec; 
for(std::vector<std::vector<int> >::iterator it=vecOfVec.begin(); it!=vecOfVec.end(); ++it) { 
    masterVec.insert(masterVec.end(), it->begin(), it->end()); 
} 

Если вы можете использовать C++ 11 код будет значительно чище:

std::vector<int> masterVec; 
for(const auto& x : vecOfVec) { 
    masterVec.insert(masterVec.end(), x.begin(), x.end()); 
} 

Как Кирил отметил в комментариях вычислительного размера результирующего вектора первый является хорошей идеей, чтобы избежать перераспределение:

size_t size = 0; 
for(std::vector<std::vector<int> >::iterator it=vecOfVec.begin(); it!=vecOfVec.end(); ++it) { 
    size += it->size(); 
} 
std::vector<int> masterVec; 
masterVec.reserve(size); 
for(std::vector<std::vector<int> >::iterator it=vecOfVec.begin(); it!=vecOfVec.end(); ++it) { 
    masterVec.insert(masterVec.end(), it->begin(), it->end()); 
} 
+3

Слава богу за авто сейчас. – Ben

+0

Я бы добавил еще один 'for'-loop для вычисления размера заранее, а затем использовал' std :: vector :: reserve'. Да, это добавляет еще один цикл, но почти на 100% уверен, что он будет быстрее, потому что перераспределение действительно, _really_ slow (особенно, если есть много данных и даже больше, если 'int' заменяет некоторые более крупные type (не говорить о настраиваемых тяжелых классах)). –

+0

и для каждого: D – Danvil

6

Вы можете использовать insert вставить целый вектор, а не каждый элемент в отдельности. Это, вероятно, уменьшит количество перераспределений.

for (auto const & vec : vecOfVec) { 
    masterVec.insert(masterVec.end(), vec.begin(), vec.end()); 
} 

или, если ваш компилятор не поддерживает новый стиль for петли и тип вычет

for (std::vector<std::vector<int> >::iterator it = vecOfVec.begin(); it != vecOfVec.end(); ++it) { 
    masterVec.insert(masterVec.end(), it->begin(), it->end()); 
} 

Это может (или не может) быть более эффективным, чтобы сложить размер всех векторов , затем зарезервируйте достаточно места в masterVec, прежде чем вы начнете.

+0

VS2010 не может сделать для каждого. – Danvil

+1

@ Danvil: Хорошо, я добавил неприятный старый способ сделать это. –

+0

Это почти наверняка лучше предварительно размер: размеры будут локальными друг к другу. – Yakk

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