#cpp #vector
Как скопировать один вектор в другой при условии, что элементы первого имеют тип с большим диапазоном значений нежели тип элементов второго? Причем элементы первого вектора, значения которых выходят за границы типа данных элементов второго вектора, не копировать. Например, vector<__int64> скопировать в vector<__int16> так, чтобы в vector<__int16> были только те значения из vector<__int64>, которые лежат в диапазоне от -32768 до 32767.
Ответы
Ответ 1
В одиннадцатом стандарте (C++11) можно наваять что-нибудь в духе: #include#include #include int main() { std::vector<__int64> vector64 = {1, 2, 3, 1234567, 5}; std::vector<__int16> vector16(vector64.size()); auto it = std::copy_if(vector64.begin(), vector64.end(), vector16.begin(), [&](__int64 item){ return (INT16_MIN <= item && item <= INT16_MAX); }); vector16.resize(std::distance(vector16.begin(), it)); } Или более общий вариант: #include #include #include // случае использования не только для целочисленных типов, а для любых конрертируемых: //template ::value>::type> template ::value && std::is_integral ::value>::type> void copyIfPossible(const std::vector & from, std::vector & to) { to.clear(); std::copy_if(from.begin(), from.end(), std::back_inserter(to), [&](const From& item){ return (std::numeric_limits ::min() <= item && item <= std::numeric_limits ::max()); }); } int main() { std::vector<__int64> vector64 = { 1, 2, 3, 1234567, 5 }; std::vector<__int16> vector16; copyIfPossible(vector64, vector16); std::vector vectorDouble; //copyIfPossible(vector64, vectorDouble); // ошибка компиляции } Ответ 2
для общего случая вы можете сделать шаблонную функцию с применением numeric_limits templatestd::vector my_copy(std::vector v) { static_assert(std::is_convertible ::value, "cannot convert"); std::vector result; std::for_each (v.begin(), v.end(), [&](T_FROM i) { if (std::numeric_limits ::min() <= i && i <= std::numeric_limits ::max()) result.push_back(i); }); return result; } //..... std::vector v16; std::vector v64; //..... v16 = my_copy (v64);
Комментариев нет:
Отправить комментарий