Могу ли я использовать галстук, чтобы поместить элементы пары в вектор? - PullRequest
3 голосов
/ 11 июля 2019

Допустим, у меня есть такая функция: pair<int, int> func() и vector<int> vec.Я хочу сделать это:

vec.resize(size(vec) + 2U);

tie(*next(rbegin(vec)), *rbegin(vec)) = func();

Я просто чувствую, что это действительно сложный способ написать, что я делаю.Есть ли способ сделать это без вызова resize и все такое?

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Простое решение C ++ 17 со структурированными привязками:

std::pair<int, int> func();

int main()
{
    std::vector<int> vec;
    vec.reserve(2);

    const auto [a, b] = func();
    vec.push_back(a);
    vec.push_back(b);
}  

живой пример на godbolt.org


C++ Расширение 17 пакетов:

const auto vec = std::apply([](auto... xs)
{
    return std::vector{xs...};
}, func());

живой пример на godbolt.org


C ++ 17 расширений решение(в существующем векторе):

std::vector<int> vec;
std::apply([&vec](auto... xs)
{
    (vec.push_back(xs), ...);
}, func());
1 голос
/ 11 июля 2019

Вместо этого вы можете использовать структурированные привязки (C ++ 17) и push_back:

auto [elem1, elem2] = func();

vec.push_back(elem1);
vec.push_back(elem2);

Это определенно проще для чтения.

...