Инициализация пары векторов и их преобразование - PullRequest
0 голосов
/ 08 декабря 2018

Я хотел бы использовать пару векторов вместо двух векторов в моих функциях преобразования, но не знаю, как я мог бы инициализировать два вектора внутри функции make_pair.

У меня есть следующий код, и он отлично работает:

vector<Point> group_pts(size);
vector<int> group_rs(size);

std::transform(group.begin(), group.end(), group_pts.begin(), 
         [](const Circle& c1) -> Point { return c1.p;    } );
std::transform(group.begin(), group.end(), group_rs.begin(), 
         [](const Circle& c1) -> int { return c1.radius; } );
std::pair < vector<Point>, vector<int> > group_dscrp = make_pair(group_pts, group_rs);
return group_dscrp;

Но мне нужно что-то подобное, но я не знаю, как мне инициализировать

std::pair < vector<Point>, vector<int> > group_dscrp = INIT;

std::transform(group.begin(), group.end(), group_dscrp.first.begin(), 
              [](const Circle& c1) -> Point { return c1.p; } );

std::transform(group.begin(), group.end(), group_dscrp.second.begin(), 
              [](const Circle& c1) -> int {   return c1.radius; } );

return group_dscrp;

1 Ответ

0 голосов
/ 08 декабря 2018

Ответ на ваш вопрос уже упоминается в комментариях (@MatthieuBrucher).

std::pair<vector<Point>, vector<int>> group_dscrp{size, size}

инициализирует пару векторов.

Однако, если вам нужна структура данныхкоторый содержит как Point, так и radius член Circle, вы можете переосмыслить (как упомянуто @WhozCraig)

std::vector<std::pair<Point, int>> group_dscrp

Теперь вы можете снова либо сыграть с std::transform

std::transform(group.cbegin(), group.cend(), std::back_inserter(group_dscrp), 
    [](const Circle& circle) {return std::pair<Point, int>{ circle.p, circle.radius };  });

или используйте простой цикл на основе диапазона для вставки в group_dscrp следующим образом:

std::vector<Circle> group;
std::vector<std::pair<Point, int>> group_dscrp;
group_dscrp.reserve(size);
for (const Circle& circle : group) group_dscrp.emplace_back(circle.p, circle.radius);
...