2015-06-25 4 views
0

Я знаю отливку из первого массива.Как преобразовать double в int в вектор C++?

std::vector<int> v_int; 
std::vector<float> v_float(v_int.begin(), v_int.end()); 

но как преобразовать второй массив?

vector<int> aCol(4); 
vector<vector<int>> a(2, aCol); 
vector<vector<double>> b(a.begin(), a.end());// ??? 

Что делать в этом случае?

+1

Чтобы скопировать содержимое' станд :: вектор 'в a'std :: вектор '? – Alejandro

+1

Вы хотите 'std :: vector v_int (v_float.begin(), v_float.end());'? С какой проблемой вы столкнулись? – songyuanyao

+0

vector aCol (4); vector < vector> a (2, aCol); vector <вектор > b (a.begin(), a.end()); ?????????????? –

ответ

1

Для компилятора vector<int> и vector<double> являются совершенно несвязанными типами, неявно конвертируемыми друг к другу. Что вы можете сделать что-то вроде:

for(auto&& elem: a) 
    b.push_back(std::vector<double>(elem.begin(), elem.end())); 
1
vector<vector<double>> b; 
b.reserve(a.size()); 
for (const auto& elem : a) { 
    b.emplace_back(elem.begin(), elem.end()); 
} 
0

Причины вашего вектора-из-векторов строительства не составитель, потому что

vector<vector<double>> b(a.begin(), a.end()) 

находится в диапазоне построения b с итераторами, чьи типа элемента vector<int> , Это попытается построить b 's внутренние std::vector<double> s с std::vector<int> s, что неудивительно, что он не должен компилироваться.

Сравнивая это ваш первый пример,

std::vector<float> v_float(v_int.begin(), v_int.end()); 

находится в диапазоне построения v_float от итераторов, чей тип элемента int. Это работает, потому что разрешено преобразование из int в float, но не от std::vector<int> до std::vector<double> (или std::vector<float>).

Вы можете вместо этого смотреть на пробегаем по каждому элементу a и отодвигая вектор, построенный из a «s begin() и end()

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