Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Копирование векторов

#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 template std::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);

Комментариев нет:

Отправить комментарий