Как упростить этот код, используя decltype? - PullRequest
0 голосов
/ 16 мая 2019

Я должен упростить код, найдя подходящее место для использования decltype.Также есть место, где auto не будет работать в этом коде?

 map<int, float> m = build_map();
 std::pair<int, int> scaling_factor(2, 3);
 std::pair<int, int>* scaled_array = new std::pair<int, int>[m.size()];

 int i(0);
 for(map<int, float>::iterator it=m.begin(); it!=m.end(); it++, i++)
 {
   std::pair<int, int> tmp = *it;
   tmp.first*= caling_factor.first;
   tmp.second*= scaling_factor.second;
   scaled_array[i] = tmp;
 }

Ответы [ 3 ]

0 голосов
/ 16 мая 2019

Вот упрощение:

auto m = build_map();
const std::pair<int, int> scaling_factor(2, 3);
auto* scaled_array = new std::pair<int, int>[m.size()];

int i(0);
for (std::pair<int, float> copy : m) // copy and conversion
{
    copy.first *= caling_factor.first;
    copy.second *= scaling_factor.second;
    scaled_array[i++] = copy;
}

std::transform кажется также хорошим улучшением.

0 голосов
/ 16 мая 2019

или далее:

auto m = build_map();
auto scaling_factor = std::make_pair(2, 3);
std::vector<scaling_factor> scaled_array;

На самом деле кто-то изменил это на вектор, поэтому оригинал:

auto scaled_array = new decltype(scaling_factor)[m.size()];

Но вам нужно решить, является ли это более читабельным, особенно еслискрывает, что .second изменил тип между картой и массивом.

0 голосов
/ 16 мая 2019

Если я правильно понял вопрос, вы хотите упростить свой код с помощью ключевого слова auto.

Первое, что приходит на ум, это цикл Range-For:

std::map<int, float> m = build_map();
std::pair<int, int> scaling_factor(2, 3);
std::vector<std::pair<int, int>> scaled_array;

scaled_array.reserve(m.size());

for (auto &el : m) {
    scaled_array.emplace_back(
        el.first * scaling_factor.first,
        el.second * scaling_factor.second
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...