Хороший способ скопировать std: setв стандартный набор - PullRequest
0 голосов
/ 17 сентября 2018

Существует неявное преобразование между uint32_t и int32_t.Я был немного удивлен, обнаружив, что не могу сказать:

void somefunc(std::set<uint32_t> arg);

std::set<int32_t> ary1;
somefunc(ary1);

Почему это так?Существует ли краткий и приятный синтаксис, чтобы сделать это без записи цикла for для копирования первого массива int32_t во временный массив uint32_t?

Спасибо.

1 Ответ

0 голосов
/ 17 сентября 2018

Стандартные контейнеры обычно могут быть построены с использованием диапазонов из других контейнеров, указанных парами итераторов. Рассмотрим следующий пример:

#include <cstdint>
#include <set>

void foo(std::set<uint32_t> arg) {}

int main()
{
    std::set<int32_t> x;
    foo({ x.begin(), x.end() });
}

foo ожидает std::set<uint32_t>, но x - std::set<int32_t>. {x.begin(), x.begin()} создает новый временный std::set<uint32_t>, который копирует все значения из x. Это похоже на std::set<uint32_t>(x.begin(), x.end()), который вы можете найти в старом коде. Это также работает между различными видами контейнеров, при условии, что содержащиеся в них элементы совместимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...