Страницы

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

воскресенье, 7 апреля 2019 г.

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

Как скопировать один вектор в другой при условии, что элементы первого имеют тип с большим диапазоном значений нежели тип элементов второго?
Причем элементы первого вектора, значения которых выходят за границы типа данных элементов второго вектора, не копировать.
Например, vector<__int64> скопировать в vector<__int16> так, чтобы в vector<__int16> были только те значения из vector<__int64>, которые лежат в диапазоне от -32768 до 32767.


Ответ

В одиннадцатом стандарте (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); // ошибка компиляции }

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

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