2015-06-09 6 views
2

Что такое хороший способ конвертировать vector<vector<int>> vint в vector<vector<double>>vdouble?C++ 2D вектор - конвертировать int, чтобы удвоить

Я знаю от C++ convert vector<int> to vector<double>, что это можно сделать для 1-D, но я не слишком уверен, как это сделать для 2-го случая.

+2

Ну, вы делаете это для каждого из векторов, которые содержатся в другой. –

ответ

3

Вот довольно простое решение, которое использует emplace_back и конструктор вектор диапазон:

std::vector<std::vector<int>> intvec; 
//intvec filled somehow 

std::vector<std::vector<double>> doublevec; 
doublevec.reserve(intvec.size()); 
for (auto&& v : intvec) doublevec.emplace_back(std::begin(v), std::end(v)); 
+0

Приятный намек на использование 'emplace_back'! –

+0

Любопытно, почему вы предпочитаете 'std :: begin (v)' over 'v.begin()'? –

+1

@MustafaOzturk, потому что 'std :: begin' работает с надмножеством типов для версии функции-члена, поэтому я использую его везде для согласованности. – TartanLlama

0

Наивное решение состоит в том, чтобы использовать две петли, одну вложенную внутри другой, предпочтительно range-based for loops.

Вы также можете использовать, например. std::transform с lambda expression, который в свою очередь также вызывает std::transform на вложенном векторе, который выполняет фактическое преобразование.

Если вы используете std::transform, то указывайте set the size целевого вектора или используйте, например. std::back_inserter.

2
#include <iostream>                                                       
#include <vector> 
#include <algorithm> 

double castToDouble(int v) { 
    return static_cast<double>(v); 
} 

int main() { 
    std::vector<std::vector<int>> intv; 
    std::vector<std::vector<double>> doublev; 

    std::transform(intv.begin(), intv.end(), std::back_inserter(doublev), [](const std::vector<int> &iv) { 
     std::vector<double> dv; 
     std::transform(iv.begin(), iv.end(), std::back_inserter(dv), &castToDouble); 
     return dv; 
    }); 

    return 0; 
} 
0

простой способ с std::transform и конструктора дальности std::vector. Если вы используете back_inserter, вы должны указать reserve(), чтобы избежать повторных перераспределений.

Живой пример: http://coliru.stacked-crooked.com/a/84ef0e3d6572792a

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::vector<std::vector<int>> vvi = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; 
    std::vector<std::vector<double>> vvd; 
    vvd.reserve(vvi.size()); 

    std::transform(begin(vvi), end(vvi), std::back_inserter(vvd), 
        [](const std::vector<int>& vi) { 
         return std::vector<double>(begin(vi), end(vi)); 
        }); 

    // Output the destination container for verification: 
    for_each(begin(vvd), end(vvd), [](const std::vector<double>& vd){ 
     std::copy(begin(vd), end(vd), std::ostream_iterator<double>(std::cout, " ")); 
     std::cout << "\n";}); 
} 
+1

Вы должны называть «резерв» на всех ваших целевых векторах. –

+0

@MustafaOzturk Хорошая точка. Я отредактирую пример. – Andrew

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